Sqlalchemy: создать предложение OR с несколькими фильтрами () - вызовы - PullRequest
8 голосов
/ 01 сентября 2010

Я новичок в sqlalchemy и могу использовать некоторую помощь.Я пытаюсь написать небольшое приложение, для которого мне нужно динамически изменить оператор выбора.Поэтому я делаю s = select([files]), а затем добавляю фильтры по s = s.where(files.c.createtime.between(val1, val2)).Это прекрасно работает, но только с AND-соединением.Итак, когда я хочу получить все записи с createtime (between 1.1.2009 and 1.2.2009) OR createtime == 5.2.2009, у меня возникла проблема, заключающаяся в том, что я не знаю, как этого добиться с помощью различных вызовов фильтра.Из-за логики программ невозможно использовать s= s.where(_or(files.c.createtime.between(val1, val2), files.c.createtime == DateTime('2009-02-01')))

Заранее спасибо, Christof

Ответы [ 2 ]

26 голосов
/ 03 сентября 2010

Вы можете создавать или динамически составлять списки:

clauses = []
if cond1:
    clauses.append(files.c.createtime.between(val1, val2))
if cond2:
    clauses.append(files.c.createtime == DateTime('2009-02-01'))
if clauses:
    s = s.where(or_(*clauses))
2 голосов
/ 03 сентября 2010

Если вы хотите «обмануть», используя недокументированный атрибут _whereclause для Select объектов, вы можете постепенно указывать серию условий ИЛИ, каждый раз создавая новый запрос на основе предыдущего пункт:

s = select([files]).where(literal(False)) # Start with an empty query.
s = select(s.froms).where(or_(s._whereclause,
        files.c.createtime.between(val1, val2)))
s = select(s.froms).where(or_(s._whereclause,
        files.c.createtime == datetime(2009, 2, 1)))

Создание союза является еще одним вариантом. Это немного сложнее, но не зависит от недокументированных атрибутов:

s = select([files]).where(literal(False)) # Start with an empty query.
s = s.select().union(
        select([files]).where(files.c.createtime.between(val1, val2)))
s = s.select().union(
        select([files]).where(files.c.createtime == datetime(2009, 2, 1)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...