SQLAlchemy:在查询中选择对象的哪些列
是否可以控制在SQLAlchemy的查询方法中查询哪些列,同时仍返回您正在查询的对象的实例(尽管已部分填充)?
还是SQLAlchemy有必要执行SELECT *
映射到对象?
(我确实知道可以查询单个列,但不会将结果映射到对象,而仅映射到命名元组的组件)。
例如,如果User对象具有属性userid,name,password和bio,但是您希望查询仅为其返回的对象填写userid和name:
# 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)>
...
这可能吗; 如果是这样,怎么办?
-
您可以查询单个列,这些列返回命名元组,实际上,如果您只是传递给模板或其他对象,它们的行为实际上与映射对象非常相似:
http://www.sqlalchemy.org/docs/orm/tutorial.html#querying
或者您可以通过配置或使用选项在映射的类上将各种列设置为“ deferred”:
http://docs.sqlalchemy.org/en/latest/orm/loading_columns.html#deferred-
column-
loading在Trac中有一张旧票叫“ 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"]))
defer()应该真正接受倍数,为此添加了票证#2250(编辑:如注释中所述,它在0.9中为load_only())