SQLalchemy核心中AND和OR语句的语法?

时间:2014-03-02 05:15:15

标签: python sqlite sqlalchemy

如何在SQLalchemy核心中编写以下SQLite表达式?

SELECT * FROM table
WHERE id = 1
AND (last_date IS NULL OR
    last_date < date('now', '-30 day') );

我在SQLalchemy orm中使用_and_or看到了一些示例,但我不确定这些是否适用于SQLalchemy核心。

http://docs.sqlalchemy.org/en/rel_0_9/orm/tutorial.html#common-filter-operators

1 个答案:

答案 0 :(得分:5)

是的,您可以对列表达式使用sqlalchemy.and_sqlalchemy.or_(注意末尾的下划线,而不是开头,前导下划线表示不受支持的私有API)。

您还可以使用按位运算符&|,它们的编译方式与and_ / or_相同。请务必正确加以填充,&|的运算符优先级高于andor

您的代码看起来有点像:

t.select().where((t.c.id == 1) 
                 & ((t.c.last_date == None)
                    | (t.c.last_date < sa.func.date('now', '-30 day'))))

另一个选择是将连接子句视为逐步过滤的关系,因为身份:

  

σa∧bR↔σ b σ a R

您可以在sqlalchemy中将其写为

t.select().where(t.c.id == 1) \
          .where((t.c.last_date == None)
                 | (t.c.last_date < sa.func.date('now', '-30 day')))

它产生与上面相同的SQL。