是否可以控制在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)>
...
这可能吗?如果是这样,怎么样?
答案 0 :(得分:17)
您可以查询单个列,这些列返回的命名元组实际上与您映射的对象非常相似,如果您只是传递给模板或其他内容:
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())
答案 1 :(得分:8)
一个对我有用的简单解决方案是:
users = session.query(User.userid, User.name)
for user in users:
print user
会打印:
<User(1, 'bob')>
<User(2, 'joe')>
...
答案 2 :(得分:3)
load_only
的最新文档在这里
http://docs.sqlalchemy.org/en/latest/orm/loading_columns.html#load-only-cols
如果您正在寻找在模型定义级别控制该方法的方法,请使用deferred
http://docs.sqlalchemy.org/en/latest/orm/loading_columns.html#deferred