PyramidでSQLAlchemy:Where句でAND/OR条件指定をする

前回はSQLAlchemyにて、WHERE句を使って条件指定したSELECT文の実行方法を確認しました。
今回は、そのWHERE句でのAND条件とOR条件の指定方法を確認します。
具体的には、filterメソッド内での条件の書き方で、AND条件になったり、OR条件になったりします。
それでは以下で説明します。

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

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

SELECT * FROM models WHERE id = 1 AND name='one';
SELECT * FROM models WHERE id = 1 OR name='two';

(1)ORMを使った場合

AND条件で複数の条件指定をするには、以下のようにfilterメソッドの引数で、カンマ区切りで条件を追加します。
result = DBSession.query(MyModel).filter(MyModel.id==1, MyModel.name=='one').all()

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

SELECT models.id AS models_id, models.name AS models_name, models.value AS models_value
FROM models
WHERE models.id = %(id_1)s AND models.name = %(name_1)s

MyModel.idに対する条件と、MyModel.nameに対する条件が、AND条件で指定されています。
上記の記述方法の他にも、以下のようにfilterメソッドを複数指定しても同様の結果が得られます。
result = DBSession.query(MyModel).filter(MyModel.id==1).filter(MyModel.name=='one').all()

では、次にOR条件について確認します。
OR条件にするには、filterメソッドでの条件指定の部分をor_関数を使って以下のように指定します。
result = DBSession.query(MyModel).filter( or_(MyModel.id==1, MyModel.name=='two') ).all()

ただし、or_関数を利用するには以下のようにimportしておく必要があります。
from sqlalchemy import or_

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

SELECT models.id AS models_id, models.name AS models_name, models.value AS models_value
FROM models
WHERE models.id = %(id_1)s OR models.name = %(name_1)s

MyModel.idに対する条件と、MyModel.nameに対する条件が、OR条件で指定されています。

では、ORとANDを組み合わせて、以下のようなSQLを作るにはどうすればよいでしょうか。

SELECT * FROM models WHERE (id = 1 OR name='two') AND value=1;

答えは想像通りですが、コレです。
result = DBSession.query(MyModel).filter(or_(MyModel.id==1,MyModel.name=='two'), MyModel.value==1).all()

(2)SQL文を指定して実行する方法
SQL文を直接指定して実行する場合は、特別変わった事は無く以下のようにします。

result = DBSession.execute(
     "SELECT * FROM models where id=:id AND name=:name",{'id':1, 'name':'one'}
     )
result = DBSession.execute(
     "SELECT * FROM models where id=:id OR name=:name",{'id':1, 'name':'two'}
     )

今回はここまで。
SQLAlchemyでのWHERE句のAND条件とOR条件指定方法を確認しました。

次回以降は、WHERE句での条件指定につかう主な演算子について確認していきます。