PyramidでSQLAlchemy:BETWEEN演算子で範囲指定検索をする

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

今回は、BETWEEN演算子の使い方について見ていきます。

以下のSQLを実行する事を目指します。

SELECT * FROM models WHERE value BETWEEN 1 AND 3;

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

(1) betweenメソッドを使って、BETWEEN条件を指定する

BETWEEN演算子を使って値の範囲指定をするには、filterメソッドの引数にて、条件指定したいカラムに対してin_メソッドを以下の様に適用させます。

result = DBSession.query(MyModel).filter(MyModel.value.between(1,3)).all()

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

SELECT models.id AS models_id, models.name AS models_name, models.value AS models_value
FROM models
WHERE models.value BETWEEN %(value_1)s AND %(value_2)s

MyModel.valueに対してBETWEEN演算子が適用されています。

(2) between_op、という関数もあります。

これも余談になりますが、上記で見てきたもの以外にもbetween_op、という関数もあります。
sqlalchemy.sql.operatorsにて定義されているので、以下の様にimportすると使えます。
from sqlalchemy.sql.operators import between_op

使い方はこれです。
result = DBSession.query(MyModel).filter(between_op(MyModel.value,1,3)).all()

この場合、ログに出力されたSQLは以下でした。

SELECT models.id AS models_id, models.name AS models_name, models.value AS models_value
FROM models
WHERE models.value BETWEEN %(value_1)s AND %(value_2)s

betweenメソッドと同じですね。
between_opの定義を見れば分かりませすが、内部的にはbetween_メソッドを読んでいるだけでした。
なので、同じ結果がでるのは当たり前ですね。

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

result = DBSession.execute(
     "SELECT * FROM models where value between :value1 and :value2", {'value1':1,'value2':3}
)

実行すると、ログにはORMを使った場合と同様に以下が出力されました。

SELECT * FROM models where value between %(value1)s and %(value2)s

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

こここまでで、WHERE句で使う主な演算子について確認できました。
SQLAlchemyネタとしては、次はテーブル結合を取り上げたいと思います。

が、SQLAlchemyネタも少々飽きてきたので、次回はPyramidの話題に戻したいと思います。