2011-08-08 8 views
15

SQLAlchemyのクエリメソッドで照会する列を制御することはできますが、照会しているオブジェクトのインスタンスはまだ返されています(部分的には取り込まれます)。SQLAlchemy:クエリ内のオブジェクトの列を選択する

またはSQLAlchemyがオブジェクトにマップするためにSELECT *を実行する必要がありますか?

(私は、個々の列を照会することは可能ですが、結果をオブジェクトにマップするのではなく、名前付きタプルの構成要素にのみマップすることを知っています)。例えば

、ユーザーオブジェクト属性のユーザーID、名前、パスワード、およびバイオを持っていますが、あなただけが返すオブジェクトのためのユーザーIDと名前を記入するクエリしたい場合:

# hypothetical syntax, of course: 
for u in session.query(User.columns[userid, name]).all(): 
    print u 

を印刷し:

<User(1, 'bob', None, None)> 
<User(2, 'joe', None, None)> 
... 

これが可能です。もしそうなら、どうですか?

あなたはあなただけのテンプレートか何かにオフに渡している場合は、あなたのマップされたオブジェクトのようにかなりの実際の行為にやるという名前のタプルを返しており、個々の列を照会することができます

答えて

16

http://www.sqlalchemy.org/docs/orm/tutorial.html#querying

かをいずれかの立体配置またはオプションを使用して、「延期」としてマッピングクラス上のさまざまな列を確立することができます。

http://docs.sqlalchemy.org/en/latest/orm/loading_columns.html#deferred-column-loading

somethinのためのtracの古いチケットがあります誰かが機能を追加することができませんでしたない理由はありません提供するテストや、そのようなように感じた場合gは、「defer_everything_but()」と呼ばれ、ここで迅速なバージョンです:

from sqlalchemy.orm import class_mapper, defer 
def defer_everything_but(entity, cols): 
    m = class_mapper(entity) 
    return [defer(k) for k in 
      set(p.key for p 
       in m.iterate_properties 
       if hasattr(p, 'columns')).difference(cols)] 

s = Session() 
print s.query(A).options(*defer_everything_but(A, ["q", "p"])) 

延期()本当に倍数を受け入れる必要があり、チケットを追加しましたそのための#2250(編集:コメントで述べたように、これはload_only()として0.9である)あなたがコントロールする方法を見ている場合はload_onlyため

+9

、 ['load_only()'](http://docs.sqlalchemy.org/en/latest/orm/mapper_config.html#sqlalchemy.orm.load_only)を参照してください。 – kolypto

5

た使用:

users = session.query(User.userid, User.name) 
for user in users: 
    print user 

は印刷されます:SA> = 0.9.0では

<User(1, 'bob')> 
<User(2, 'joe')> 
...