Python Sqlalchemy complex in_uu子句,元组列表中有元组

Python Sqlalchemy complex in_uu子句,元组列表中有元组,python,sql,sqlalchemy,Python,Sql,Sqlalchemy,我试图找到一种方法,使SQLAlchemy生成以下形式的查询: select * from t where (a,b) in ((a1,b1),(a2,b2)); 从t中选择*,其中((a1,b1)、(a2,b2))中的(a,b); 这可能吗 如果没有,有什么建议可以模仿它吗?好吧,多亏了上面的郝莲,我想出了一个功能性的解决方案 假设我们有一个声明式风格的映射类,Clazz,以及一个复合主键值元组的列表,values (经过编辑以使用更好的(IMO)sql生成样式): 从sqlalchemy.s

我试图找到一种方法,使SQLAlchemy生成以下形式的查询:

select * from t where (a,b) in ((a1,b1),(a2,b2)); 从t中选择*,其中((a1,b1)、(a2,b2))中的(a,b); 这可能吗


如果没有,有什么建议可以模仿它吗?

好吧,多亏了上面的郝莲,我想出了一个功能性的解决方案

假设我们有一个声明式风格的映射类,
Clazz
,以及一个复合主键值元组的列表,
values
(经过编辑以使用更好的(IMO)sql生成样式):

从sqlalchemy.sql.expression导入文本,bindparam ... 定义参数(自、f、vs、ts、bs): 对于枚举中的j,v(vs): 键=f%(j+97) 追加(bindparam(键,值=v,类型=ts[j])) 产生“:%s”%key 定义增长(自我、ts、值、bs): 对于枚举中的i,vs(值): f='%c%d'%i 产生“(%s)”%,”。连接(自参数(f、vs、ts、bs)) 定义(self、k、ts): 对于k中的c: ts.append(c.type) 产量str(c) def_u_makeSql(self、Clazz、values): t=[] b=[] 返回文本( “(%s)在(%s)”中%( “,”.join(self.uuugkeys(Clazz.uuuu table.uuuuu.primary_ukey,t)), “,”.join(self.u增长(t,value,b)), bindparams=b) 此解决方案适用于复合主键或简单主键。不过,对于简单的主键,它可能略慢于
col.in(keys)


我仍然对更好的方法的建议很感兴趣,但这种方法目前正在发挥作用,其性能明显优于
或(和(和(条件)
方法,或
用于键入键:do_stuff(q.get(key))
方法。

请参阅in-SQLAlchemy 0.6

使用
元组

keys = [(a1, b1), (a2, b2)]
session.query(T).filter(tuple_(T.a, T.b).in_(keys)).all()

使用文本子句的简单无痛方法:

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)})

只需确保键是元组对数组。

警告(来自sqlalchemy doc):并非所有后端都支持复合IN构造,目前已知该构造适用于PostgreSQL和MySQL,但不适用于SQLite。当调用此类表达式时,不受支持的后端将引发DBAPIError的子类。是否有人想评论终端
.all()
的功能?
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)})