sqlalchemy IS NOT NULL選択


104

SQLのようにフィルターを追加して、特定の列からNULLでない値を選択するにはどうすればよいですか?

SELECT * 
FROM table 
WHERE YourColumn IS NOT NULL;

SQLAlchemyフィルターでどうすれば同じことができますか?

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

all_filtersここは何ですか?なぜselect_from
Martijn Pieters

そして、あなたはテーブル定義を持っていますか、それとも列リテラルを使用する必要がありますか?
Martijn Pieters

回答:


137

column_obj != NoneIS NOT NULL制約が生成されます

列のコンテキストでは、句を生成しa != bます。ターゲットがの場合None、を生成しIS NOT NULLます。

または使用isnot()(0.7.9の新機能):

IS NOTオペレーターを実装します。

通常、IS NOTNone、に解決されるの値と比較すると自動的に生成されます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 2016年

21
@Breezer:なし、ためisの方法は、カスタムクラスでオーバーロードすることはできません!=することができます。
Martijn Pieters

3
他の答えは今のところ好ましい答えです。また、PyCharmを含む多くのIDEが警告を生成しないようにします。
Antti Haapala 2016年

@AnttiHaapala:「望ましい」かどうかはわかりません。SQLAlchemyのドキュメントでは、ブール値をより重要なユースケースとして引用しています。そのオプションを追加しました。
Martijn Pieters

99

バージョン0.7.9以降では.isnot、次のように、制約を比較する代わりにフィルター演算子を使用できます。

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

この方法は、pep8が問題になる場合にのみ必要です。

ソース:sqlalchemyドキュメント


5
これは、pep8を幸せにするだけNULLでなく、!=SQL のRHSとしては有効ではなく、isnotより適切に使用することで、生成されたステートメントをどのように見せたいかという意図を伝えるため、より良いソリューションだと思います。
Josh

2
@Josh:!= NULLただし、column != NonePython側で使用してもSQLAlchemyは出力しません。あなたが得るIS NOT NULL。ただし、を.isnot()使用する IS NOT、他の型を強制できます(.isnot(True)たとえば、ブール型の列と比較してください)。
Martijn Pieters

43

他の誰かが疑問に思っている場合は、を使用is_して生成できますfoo IS NULL

>>> sqlalchemy.sqlインポート列から
>>> print column( 'foo')。is_(None)
fooはNULLです
>>> print column( 'foo')。isnot(None)
fooはNULLではありません

1
ありがとう、これは私が探していたものですが、Googleがここに送ってくれました!
ひげ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.