Sqlalchemy complex in_ предложение с кортежем в списке кортежей - PullRequest
6 голосов
/ 04 июня 2009

Я пытаюсь найти способ заставить SQLAlchemy сгенерировать запрос следующей формы:

select * from t where (a,b) in ((a1,b1),(a2,b2));

Возможно ли это?

Если нет, то есть ли какие-либо предложения по его подражанию?

Ответы [ 3 ]

21 голосов
/ 17 июля 2011

Использование 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_

3 голосов
/ 04 июня 2009

Что ж, благодаря Хао Лиану выше, я нашел функциональное, но болезненное решение.

Предположим, что у нас есть класс сопоставленного декларативного стиля Clazz и list кортежей значений составного первичного ключа values (Отредактировано для использования лучшего (IMO) стиля генерации sql):

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)

Это решение работает для составных или простых первичных ключей. Это, вероятно, немного медленнее, чем col.in_(keys) для простых первичных ключей.

Меня все еще интересуют предложения о лучших способах сделать это, но пока этот способ работает и работает заметно лучше, чем способ or_(and_(conditions)) или for key in keys: do_stuff(q.get(key)).

2 голосов
/ 02 апреля 2010

см. Конструкцию tuple_ в SQLAlchemy 0.6

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...