【问题标题】:Syntax for AND and OR statements in SQLalchemy core?SQLalchemy 核心中 AND 和 OR 语句的语法?
【发布时间】:2019-07-17 03:07:16
【问题描述】:

如何在 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 核心。

https://docs.sqlalchemy.org/en/latest/orm/tutorial.html#common-filter-operators

【问题讨论】:

    标签: python sqlite sqlalchemy


    【解决方案1】:

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

    您还可以使用&amp;|,按位运算符,它们的编译方式与and_/or_ 相同。一定要正确地将它们括起来,&amp;| 的运算符优先级比 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 σaR

    你可以在 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。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-20
      • 1970-01-01
      • 2021-10-27
      • 2015-06-12
      • 2012-02-22
      • 1970-01-01
      • 1970-01-01
      • 2017-11-16
      相关资源
      最近更新 更多