【发布时间】:2010-10-31 04:44:49
【问题描述】:
我正在尝试找到一种方法让 SQLAlchemy 生成以下形式的查询:
select * from t where (a,b) in ((a1,b1),(a2,b2));这可能吗?
如果没有,有什么模仿它的建议吗?
【问题讨论】:
标签: python sql sqlalchemy
我正在尝试找到一种方法让 SQLAlchemy 生成以下形式的查询:
select * from t where (a,b) in ((a1,b1),(a2,b2));这可能吗?
如果没有,有什么模仿它的建议吗?
【问题讨论】:
标签: python sql sqlalchemy
使用tuple_:
keys = [(a1, b1), (a2, b2)]
session.query(T).filter(tuple_(T.a, T.b).in_(keys)).all()
http://docs.sqlalchemy.org/en/latest/core/sqlelement.html#sqlalchemy.sql.expression.tuple_
【讨论】:
.all()做了什么吗?
好吧,多亏了上面的郝连,我想出了一个实用但痛苦的解决方案。
假设我们有一个声明式映射类 Clazz 和一个由复合主键值元组组成的 list values
(编辑为使用更好的 (IMO) sql 生成样式):
此解决方案适用于复合或简单主键。不过,对于简单的主键,它可能比 col.in_(keys) 慢一些。
我仍然对执行此操作的更好方法的建议感兴趣,但这种方法目前有效,并且性能明显优于 or_(and_(conditions)) 方式或 for key in keys: do_stuff(q.get(key)) 方式。
【讨论】:
查看 SQLAlchemy 0.6 中的 tuple_ construct
【讨论】:
带有文本子句的简单无痛方法:
from sqlalchemy import text
keys = [('a1', 'b1'), ('a2', 'b2')]
statement = text(f'SELECT t.* FROM table t WHERE (t.a, t.b) in :keys')
session.execute(statement, {'keys': tuple(keys)})
只需要确保键是元组对的数组。
【讨论】: