Cóż, dzięki Hao Lianowi powyżej wymyśliłem funkcjonalne, choć bolesne rozwiązanie.
Załóżmy, że mamy deklaratywny stylu odwzorowane klasy, Clazz
oraz list
krotek związku wartości kluczy podstawowych, values
(Zmieniano użyć lepszego (IMO) SQL styl generacji):
from sqlalchemy.sql.expression import text,bindparam
...
def __gParams(self, f, vs, ts, bs):
for j,v in enumerate(vs):
key = f % (j+97)
bs.append(bindparam(key, value=v, type_=ts[j]))
yield ':%s' % key
def __gRows(self, ts, values, bs):
for i,vs in enumerate(values):
f = '%%c%d' % i
yield '(%s)' % ', '.join(self.__gParams(f, vs, ts, bs))
def __gKeys(self, k, ts):
for c in k:
ts.append(c.type)
yield str(c)
def __makeSql(self,Clazz, values):
t = []
b = []
return text(
'(%s) in (%s)' % (
', '.join(self.__gKeys(Clazz.__table__.primary_key,t)),
', '.join(self.__gRows(t,values,b))),
bindparams=b)
To rozwiązanie działa dla złożonych lub prostych kluczy podstawowych. Prawdopodobnie jest on jednak nieco wolniejszy niż col.in_(keys)
dla prostych kluczy podstawowych.
Nadal interesują mnie sugestie lepszych sposobów na zrobienie tego, ale ten sposób działa teraz i działa zauważalnie lepiej niż sposób or_(and_(conditions))
lub sposób for key in keys: do_stuff(q.get(key))
.
Bałem że - byłoby strasznie użyteczne konstrukt gdy chodzi o złożonych kluczy głównych. Dziękuję za odpowiedź! – lostlogic