2014-02-14 189 views
41

如何在SQL中添加筛选器以从特定列中选择不为NULL的值?sqlalchemy IS NOT NULL请选择

SELECT * 
FROM table 
WHERE YourColumn IS NOT NULL; 

我该怎么做SQLAlchemy过滤器?

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

什么是'这里all_filters'?为什么'select_from'? –

+0

你有一个表定义还是你需要使用列文字? –

回答

70

column_obj != None会产生IS NOT NULL constraint

在一列范围内,产生该条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' 
+4

“不是”是否产生相同的输出? – Breezer

+8

@Breezer:不,因为'is'不能通过自定义类以'!='的方式重载。 –

+1

另一个答案是现在的首选答案;它也避免了包括PyCharm在内的许多IDE产生警告。 –

40

版本开始0.7.9可以使用滤波器算.isnot,而不是比较紧张,像这样:

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

这种方法只需要如果pep8是一个问题。

来源:sqlalchemy documentation

+3

除了让pep8开心以外,我认为这是一个更好的解决方案,因为'NULL'在SQL中'!='的RHS并非有效,并且使用'isnot'可以更好地表达您希望生成的语句看起来像什么样的意图。 – Josh

+1

@Josh:即使您在Python端使用'column!= None',SQLAlchemy也不会发出'!= NULL';你会得到'不是NULL'。例如,使用'.isnot()'可以让你*在其他类型上强制*'不是'(想想'.isnot(True)')。 –

7

如果任何人想知道,您可以使用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