2014-02-14 127 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