PyramidでSQLAlchemy:Where句でIS NULLを使う

前回はSQLAlchemyにて、WHERE句でINを使ったOR条件検索の指定方法について確認しました。

今回は、IS演算子の使い方について見ていきます。
IS演算子を使うケースといえば、NULL判定ぐらいしか思いつきませんので、
以下のSQLを実行する事を目指します。

SELECT * FROM models WHERE value IS NULL;
SELECT * FROM models WHERE value IS NOT NULL;
SELECT * FROM models WHERE name IS NULL;
SELECT * FROM models WHERE name IS NOT NULL;

確認するデータベース環境は前回と同じです。

(1) is_メソッドを使って、IS NULL条件を指定する

IS NULL条件を指定をするには、filterメソッドの引数にて、条件指定したいカラムに対してis_メソッドを以下の様に適用させます。
result = DBSession.query(MyModel).filter(MyModel.value.is_(None)).all()

ログに出力されたSQLは以下でした。

SELECT models.id AS models_id, models.name AS models_name, models.value AS models_value
FROM models
WHERE models.value IS NULL

MyModel.valueに対してIS NULLが適用されています。
is_メソッドの引数にはNoneを渡しています。これがNULLに変換されていますね。

文字列のカラムに対しても同様で、以下のようにします。
result = DBSession.query(MyModel).filter(MyModel.name.is_(None)).all()

ログに出力されたSQLは以下でした。

SELECT models.id AS models_id, models.name AS models_name, models.value AS models_value
FROM models
WHERE models.name IS NUL

(2) isnotメソッドを使って、IS NOT NULL条件を指定する。

IS NULLの反対であるIS NOT NULL条件を指定するには、isnot メソッドを使って以下のように実装します。
result = DBSession.query(MyModel).filter(MyModel.value.isnot(None)).all()

ログに出力されたSQLは以下でした。

SELECT models.id AS models_id, models.name AS models_name, models.value AS models_value
FROM models
WHERE models.value IS NOT NULL

MyModel.idに対してIS NOT NULLが適用されています。

(3)SQL文を指定して実行する方法
SQL文を直接指定して実行する場合は、Sessionオブジェクトのexecuteメソッドを使います。
パラメータを使わずに以下の様にします。

result = DBSession.execute(
"SELECT * FROM models where value IS NULL"
)

あまり意味はありませんが、パラメータ化して以下の様にする事も可能です。

result = DBSession.execute(
"SELECT * FROM models where value IS :param", {'param':None}
)

今回はここまで。
SQLAlchemyでのIS演算子を使った検索方法を確認しました。

次回は、BETWEEN演算子について確認します。