2014-08-28 152 views
0

簡短問題:從SQL鍊金術支持的對象中獲取時,如何避免創建對象?我有一個ORM對象(聲明性基礎)對象支持一個表的列uid,名稱等。現在我想創建一個單獨的表ObjectProps,它使用uid作爲外部的主要鍵,然後添加一個文本字段。此外,它被設置爲一種關係,使得ObjectProps與ObjectProps有一種關係,稱爲props(uselist = False,backref =「object」)。使用SQL Alchemy避免創建對象

長問題:如何通過道具檢索ObjectProps的文本屬性/列沒有生成ObjectProps ORM對象?理想情況下,我希望避免創建對象,因爲理想情況下我只想檢索列的值而不創建整個ObjectProps。

推測該解決方案需要將ORM層與SQL層混合。任何幫助讚賞。

回答

1

的一切,當你使用relationship()將是一個對象的ORM負荷。這取決於這個問題是否是加載ObjectProps的性能和內存開銷,或者是否只是希望以非常好的方式訪問列而不「看到」ObjectProps。對於後者,使用關聯代理很容易,我們有這個examples。對於前者,是的,你需要使用核心,如果你只是想要一個原始的SELECT。你也許可以使用descriptor。下面是第一次訪問時從表中執行SELECT的一種方法:

class MyObject(Base): 
    # ... 

    _properties = None 

    @property 
    def my_properties(self): 
     if self._properties: 
      return self._properties 
     self._properties = dict(
       (row.key, row.value) for row in 
       object_session(self).execute(
        object_table.select(). 
        where(object_table.c.parent_id == self.id) 
       ) 
     ) 
     return self._properties 

上面有一些基本的記憶。如果您想這樣做,並將_properties鏈接到對象的生命週期,則可以將其鏈接到諸如expire之類的事件,以便您知道何時清除它。

1

我將查詢劃分爲:對象的引導和像SQL這樣的數據查詢。 嘗試一下 http://docs.sqlalchemy.org/en/rel_0_9/core/tutorial.html#selecting http://docs.sqlalchemy.org/en/latest/core/selectable.html

http://docs.sqlalchemy.org/en/rel_0_9/orm/query.html 使用quering:

.session.query(
     UserModel.id, 
     UserModel.username, 
     UserModel.email, 
     UserModel.best_friend_id, 
     FUserModel.username.label('friend_username'), 
     func.count().label('friends') 
    )\ 
     .select_from(UserModel)\ 

....

相關問題