Sqltancy 不是空选择

如何在 SQL 中添加筛选器以从某一列中选择非 NULL 值?

SELECT *
FROM table
WHERE YourColumn IS NOT NULL;

如何使用 SQLAlchemy 过滤器执行同样的操作?

select = select(table).select_from(table).where(all_filters)
165247 次浏览

column_obj != None将产生一个 IS NOT NULL约束:

在列上下文中,生成子句 a != b

或使用 is_not()*:

实现 IS NOT操作符。

通常,当与解析为 NULLNone值进行比较时,会自动生成 IS NOT。但是,如果与某些平台上的布尔值相比较,显式使用 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对象身份不等式检验不能像 !=那样被重载; 你只能得到 True,因为 ColumnClause实例与 None单例对象不同:

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

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

从版本0.7.9开始,您可以使用过滤操作符 .isnot来代替比较约束,如下所示:

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

这种方法只有在与 pep8有关的情况下才是必要的。

来源: Sql 炼金术文档

如果有人想知道,你可以使用 is_来生成 foo IS NULL:

>>> from sqlalchemy.sql import column
>>> print(column('foo').is_(None))
foo IS NULL
>>> print(column('foo').isnot(None))
foo IS NOT NULL