Python Sqlalchemy complex in_uu子句,元组列表中有元组
我试图找到一种方法,使SQLAlchemy生成以下形式的查询: select * from t where (a,b) in ((a1,b1),(a2,b2)); 从t中选择*,其中((a1,b1)、(a2,b2))中的(a,b); 这可能吗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
如果没有,有什么建议可以模仿它吗?好吧,多亏了上面的郝莲,我想出了一个功能性的解决方案 假设我们有一个声明式风格的映射类,
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)})