sqlalchemy不为空选择


104

如何像在SQL中一样添加过滤器,以从特定列中选择非空值?

SELECT * 
FROM table 
WHERE YourColumn IS NOT NULL;

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

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

这是all_filters什么 为什么select_from呢?
马丁·彼得斯

您是否有表定义或需要使用列文字?
马丁·彼得斯

Answers:


137

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'

8
“不是没有”产生相同的输出吗?
Breezer

21
@Breezer:不,因为is不能被自定义类重载!=
马丁·彼得斯

3
另一个答案是现在的首选答案。它还避免了包括PyCharm在内的许多IDE生成警告。
Antti Haapala

@AnttiHaapala:我不确定它是否是“首选”。SQLAlchemy文档引用布尔值作为更重要的用例。我已经添加了该选项。
马丁·彼得斯

99

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

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

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

来源:sqlalchemy文档


5
除了使pep8满意之外,我认为这是一个更好的解决方案,因为NULL它不是有效的!=SQL RHS,并且isnot更好地传达了您希望生成的语句看起来像什么的意图。
2013年

2
@Josh:!= NULL即使您column != None在Python端使用,SQLAlchemy也不会发出;你懂了IS NOT NULL。但是,使用using .isnot()可以强制 IS NOT使用其他类型(.isnot(True)例如,考虑布尔列)。
马丁·彼得斯

43

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

>>>来自sqlalchemy.sql导入列
>>>打印列('foo')。is_(无)
foo IS NULL
>>>打印列('foo')。isnot(无)
foo不为空

1
谢谢,这是我一直在寻找的东西,但Google却把我送到了这里!
阴险的胡须
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.