如何像在SQL中一样添加过滤器,以从特定列中选择非空值?
SELECT *
FROM table
WHERE YourColumn IS NOT NULL;
如何使用SQLAlchemy过滤器执行相同操作?
select = select(table).select_from(table).where(all_filters)
Answers:
column_obj != None
会产生一个IS NOT NULL
约束:
在列上下文中,产生子句
a != b
。如果目标是None
,则生成一个IS NOT NULL
。
或使用isnot()
(0.7.9中的新功能):
实施
IS NOT
操作员。通常,
IS NOT
当与的值进行比较时,会自动生成None
,解析为NULL
。但是,IS NOT
如果与某些平台上的布尔值进行比较,则可能需要显式使用。
演示:
>>> from sqlalchemy.sql import column
>>> column('YourColumn') != None
<sqlalchemy.sql.elements.BinaryExpression object at 0x10c8d8b90>
>>> str(column('YourColumn') != None)
'"YourColumn" IS NOT NULL'
>>> column('YourColumn').isnot(None)
<sqlalchemy.sql.elements.BinaryExpression object at 0x104603850>
>>> str(column('YourColumn').isnot(None))
'"YourColumn" IS NOT NULL'
is
不能被自定义类重载!=
。
从0.7.9版本开始,您可以使用filter运算符.isnot
而不是比较约束,如下所示:
query.filter(User.name.isnot(None))
仅当担心pep8时才需要此方法。
来源:sqlalchemy文档
NULL
它不是有效的!=
SQL RHS,并且isnot
更好地传达了您希望生成的语句看起来像什么的意图。
!= NULL
即使您column != None
在Python端使用,SQLAlchemy也不会发出;你懂了IS NOT NULL
。但是,使用using .isnot()
可以强制 IS NOT
使用其他类型(.isnot(True)
例如,考虑布尔列)。
如果其他人想知道,可以使用is_
生成foo IS NULL
:
>>>来自sqlalchemy.sql导入列 >>>打印列('foo')。is_(无) foo IS NULL >>>打印列('foo')。isnot(无) foo不为空
all_filters
什么 为什么select_from
呢?