PyramidでSQLAlchemyを使う 〜SELECT文でWHERE句を指定する〜

前回は単純なSELECT文の実行方法を確認しました。
今回は、それにWhere句で条件指定した検索の方法を、ORMを使った場合と、SELECT文を直接指定する場合の2通りで確認します。

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

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

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

(1)ORMを使った場合

条件指定をする際には、filterメソッドを使って以下のように指定します。
result = DBSession.query(MyModel).filter(MyModel.id==1).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

Where句で指定する値の部分が変数化されていて、filterメソッドで指定した値が見えません。

ログには続いて以下が出力されています。

{'id_1': 1}

上記SQLの変数名に対応する値が配列形式で出力されていました。
これにより、変数部分に値をマッピングしているのですね。

では、次に文字列のカラムnameに条件指定して検索してみます。
以下のように指定します。
result = DBSession.query(MyModel).filter(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.name = %(name_1)s

ログには続いて以下が出力されています。

{'name_1': 'one'}

name_1という変数に、fileterメソッドで指定した’one’という値がマッピングされています。

(2)SQL文を指定して実行する方法

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

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

SQL文中のパラメータは、「:変数名」と指定します。
変数に適用する値は、executeメソッドの第2引数にて、配列で指定します。
実行すると、ログにはORMを使った場合と同様に以下が出力されました。

SELECT * FROM models where id=%(id)s
{'id': 1}

では、同様にnameに対して条件指定して検索します。

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

結果は言うまでもないですが、ログには以下が出力されました。

SELECT * FROM models where name=%(name)s
{'name': 'one'}

今回はここまで。
単純なwhere句の条件指定方法を確認しました。

次回は複数カラムに指定する場合のAND条件とOR条件について確認します。