如何在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
答案 0 :(得分:5)
是的,您可以对列表达式使用sqlalchemy.and_
和sqlalchemy.or_
(注意末尾的下划线,而不是开头,前导下划线表示不受支持的私有API)。
您还可以使用按位运算符&
和|
,它们的编译方式与and_
/ or_
相同。请务必正确加以填充,&
和|
的运算符优先级高于and
和or
。
您的代码看起来有点像:
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。