假设我们有一个声明式样式的映射类,Clazz
以及一个list
复合主键值的元组values
(已编辑,以使用更好的(IMO)sql生成样式):
从sqlalchemy.sql.expression导入文本,bindparam
...
def __gParams(self,f,vs,ts,bs):
对于j,v枚举(vs):
键= f%(j + 97)
bs.append(bindparam(key,value = v,type_ = ts [j]))
产生':%s'%键
def __gRows(self,ts,values,bs):
对于i,vs的枚举(值):
f ='%% c%d'%i
产生'(%s)'%','.join(self .__ gParams(f,vs,ts,bs))
def __gKeys(self,k,ts):
对于k中的c:
ts.append(c.type)
屈服强度str(c)
def __makesql(self,Clazz,values):
t = []
b = []
返回文字(
'(%s)in(%s)'%(
','.join(self .__ gKeys(Clazz .__ table __。primary_key,t)),
','.join(self .__ gRows(t,values,b))),
bindparams = b)
此解决方案适用于复合键或简单主键。但是,它可能比col.in_(keys)
简单主键的速度稍慢。
我仍然对更好的方法的建议感兴趣,但是这种方法目前仍在起作用,并且比or_(and_(conditions))
方法或for key in keys:do_stuff(q.get(key))
方法的性能明显好。