【问题标题】:sqlalchemy IS NOT NULL selectsqlalchemy 不是 NULL 选择
【发布时间】:2021-10-21 16:54:23
【问题描述】:

如何像在 SQL 中一样添加过滤器以从特定列中选择不为 NULL 的值?

SELECT * 
FROM table 
WHERE YourColumn IS NOT NULL;

我怎样才能对 SQLAlchemy 过滤器做同样的事情?

select = select(table).select_from(table).where(all_filters) 

【问题讨论】:

  • 这里的all_filters 是什么?为什么是select_from
  • 你有表定义还是需要使用列字面量?

标签: python sqlalchemy


【解决方案1】:

column_obj != None 将产生一个IS NOT NULL constraint

在列上下文中,生成子句a != b。如果目标是None,则生成IS NOT NULL

或使用is_not()*:

实现IS NOT 运算符。

通常,IS NOTNone 的值比较时会自动生成,None 会解析为 NULL。但是,如果与某些平台上的布尔值进行比较,可能需要显式使用 IS NOT

演示:

>>> from sqlalchemy.sql import column
>>> column('YourColumn') != None
<sqlalchemy.sql.elements.BinaryExpression object at 0x10f81aa90>
>>> print(column('YourColumn') != None)
"YourColumn" IS NOT NULL
>>> column('YourColumn').is_not(None)
<sqlalchemy.sql.elements.BinaryExpression object at 0x11081edf0>
>>> print(column('YourColumn').is_not(None))
"YourColumn" IS NOT NULL

你不能在这里使用is not None,因为is not object identity inequality test不能像!=那样被重载;你只会得到True 而不是ColumnClause 实例与None 单例不是同一个对象:

>>> column('YourColumn') is not None
True

*) 该方法以前命名为isnot(),并在 SQLAlchemy 1.4 中重命名。旧名称仍可用于向后兼容。

【讨论】:

    【解决方案2】:

    从 0.7.9 版本开始,您可以使用过滤运算符 .isnot 而不是比较约束,如下所示:

    query.filter(User.name.isnot(None))

    仅当担心 pep8 时才需要此方法。

    来源:sqlalchemy documentation

    【讨论】:

    • 除了让 pep8 开心之外,我认为这是一个更好的解决方案,因为NULL 不是有效的,因为在 SQL 中 != 的 RHS 并且使用 isnot 可以更好地传达你想要的意图生成的语句看起来像。
    • @Josh:SQLAlchemy 不会发出 != NULL 但是,即使您在 Python 端使用 column != None;你得到IS NOT NULL。但是,使用 .isnot() 可以强制 IS NOT 用于其他类型(例如,将.isnot(True) 用于布尔列)。
    【解决方案3】:

    如果其他人想知道,您可以使用is_ 生成foo IS NULL

    >>> 从 sqlalchemy.sql 导入列 >>> 打印(列('foo').is_(无)) 富是空的 >>> 打印(列('foo').isnot(无)) foo 不为空

    【讨论】:

    • 谢谢,这正是我要找的,但 Google 把我发到这里了!
    猜你喜欢
    • 2011-08-01
    • 2012-08-17
    • 2018-03-20
    • 2010-10-12
    • 1970-01-01
    • 2011-03-04
    • 2021-05-06
    • 1970-01-01
    • 2021-05-16
    相关资源
    最近更新 更多