2012-07-08 37 views
2

我知道我可以從表中延遲加載列:SQLAlchemy的ORM - 在查詢時間限制列(選擇) - column_property

session.query(MyTable).options(defer(colname) 
     for colname in ['col4', 'col5', .., 'colN']) 

我只想要第一個3列,因此可以縮短,爲以下幾點:

session.query(MyTable).options(defer(col.name) 
     for col.name in MyTable.__table__.columns 
     if col.name not in ['col1', 'col2', 'col3']) 

因爲MyTable具有未在MyTable.__table__.columns列出了一些額外的column_property情況下,它們獲得包括在查詢,即使我不希望他們。

那麼有沒有一個構造來表達我想直接作爲一個限制嗎? 例如像

session.query(MyTable).options(XXselect('col1', 'col2', 'col3')) 
+1

有此建議其使用defer_everything_but()在此類似螺紋:http://stackoverflow.com/questions/6977658/sqlalchemy-selecting-which-columns-of-an-object -in-A-查詢/ 6977901#6977901。我偶然發現了這個問題,因爲我想遵循一種關係,這需要完整的對象。但我不想選擇所有列(例如,如果用戶沒有對所有列的讀取權限)。我不知道有任何其他方式可以跟蹤關鍵字, – Kevin 2013-12-09 17:17:24

回答

3

如果你只想要的值,你可以致電:

session.query(Mytable.col1, MyTable.col2, MyTable.col3). 

如果你想推遲列完整的對象,MyTable.__table__.columns應該給你不管混入的所有列。

+0

是的,想要完整的對象 – EoghanM 2012-07-10 11:50:07

+0

道歉,你說MyTable .__表__列中包含mixins是正確的......事實上,由於column_property,額外的列出現在查詢中。我已經更新了我的答案以反映這一點。 – EoghanM 2012-07-10 11:57:31

+0

對不起,我想我無法幫助你。我唯一的想法是在每列上使用'deferred',但這聽起來不是一個好主意。另外,也許用column_property添加你的表定義可能會有所幫助(從我看到的,有不同的方式來使用它)。 – madjar 2012-07-10 12:27:10

0

load_only()函數可以用於此

列的任意集合可以被選擇爲「負載僅」列,這將同時推遲對給定的實體的所有其它列,使用orm.load_only被加載():

from sqlalchemy.orm import load_only 

session.query(Book).options(load_only("summary", "excerpt"))