如果我有SQLAlchemy ORM查询:
admin_users = Session.query(User).filter_by(is_admin=True)
是否可以修改该查询返回的列?
例如,我只能选择User.id
列,并在子查询中使用它:
admin_email_addresses = Session.query(EmailAddress)\
.filter(EmailAddress.user_id.in_(admin_users.select_columns(User.id))
注意:.values()
方法不起作用,因为它执行查询并返回可迭代的结果(因此,例如,EmailAddress.user_id.in_(admin_users.values(User.id))
将执行两个查询,而不是一个查询。)
我知道我可以将第一个查询修改为Session.query(User.id)
,但我特别想知道如何修改查询返回的列。
答案 0 :(得分:16)
我对values()
事情感到痛苦。在0.6.5中,我添加了with_entities()
,就像values()
一样,除了不迭代:
q = q.with_entities(User.id)
答案 1 :(得分:2)
假设您的Address.user_id
定义了ForeignKey
,与IN
运算符相比,下面的查询将更有效地完成工作:
admin_email_addresses = session.query(EmailAddress).\
join(User).filter(User.is_admin==True)
如果你没有ForeignKey(尽管你应该),你可以明确指定join
条件:
admin_email_addresses = session.query(EmailAddress).\
join(User, User.id==EmailAddress.user_id).filter(User.is_admin==True)
但如果您真的想使用in_
运算符,请转到此处(注意subquery
):
subq = session.query(User.id).filter(User.is_admin==True).subquery()
admin_email_addresses = session.query(EmailAddress).\
filter(EmailAddress.user_id.in_(subq))