この記事では、PythonのSqlAlchemyで生のSQL文(任意の文字列のSELECTやINSERT文)を実行する方法を紹介します。
SqlAlchemyはPythonのORMで便利です。ただ複雑な結合・集計などがあるSQL(SELECT文)をORMで表現すると、ソースが難解になり、逆に普通にSQLを書いたほうが綺麗になる時があります。
今回はそんな時に役立つ、SqlAlchemyで生SQLを実行する方法を紹介します。
スポンサーリンク
SELECT文をSqlAlchemyで実行
生のSELECT文を、PythonのSqlAlchemyで実行するサンプルコードです。コード見て貰えれば分かりますが、SqlAlchemyは簡単に生SQLを実行できるようになってます。
from sqlalchemy.sql import text
#(1)生のSELECTを定義
t = text("SELECT * FROM User")
#(2)SQL実行
for r in db.session.execute(t):
#(3)辞書型で取得結果のレコードから値が取得できる
print(r["name"])
print(r["address"])
解説
PythonのSqlAlchemyで生SELECT文を実行するには、(1)の部分のように、text("...")
で実行するSQLを定義します。
次に(2)の部分で、SqlAlchemyのSession.execute()
関数に、(1)で作成したSELECT文を渡して実行します。
辞書型のリストで、SQLの検索結果が返ってきます。取得したレコードにアクセスするには、(3)のようにr["カラム名"]
で指定します。
INSERT/UPDATE/DELETEをSqlAlchemyで実行
INSERT/UPDATE/DELETEも、基本的にSELECT文の時と要領はおなじです。以下のコードは、SqlAlchemyで生のINSERT文を実行するサンプルです。
from sqlalchemy.sql import text
#(1)生のINSERT文を定義
t = text("INSERT INTO User (name, address) values ('山田太郎', '東京都'")
#(2)INSERT文を実行
db.session.execute(t)
db.session.commit()
解説
もはや、解説不要なぐらいシンプルなコードですが…一応…
実行する生INSERT文は(1)のように、text("...")
で定義します。
次に(2)の部分で、SqlAlchemyのSession.execute()
関数に、(1)で作成したINSERT文を渡して実行します。
※ UPDATE/DELETE文についても、やり方は同じです。
スポンサーリンク
execute関数にパラメータを渡す
SqlAlchemyのSession.execute()
関数にパラメータを渡すこともできます。
Session.execute()
関数の名前付き引数にパラメータを指定すると、SQLリテラルに指定したパラメータが置換されます。
from sqlalchemy.sql import text
t = text("SELECT * FROM User WHERE age >= :age_min AND age <= :age_max")
for r in db.session.execute(t, age_min = 20, age_max = 60):
print(r["name"])
print(r["address"])
さいごに
PythonのSqlAlchemyで、生SQLを実行する方法について紹介しました。あまり多様すると特定のDBに依存する事になってしまうため、要所で使用しましょう。
生SQL、生SELECT。。。生生言ったせいで、卵かけゴハン(TKG)が食べたくなりました。今日はここで失礼します。
0 件のコメント:
コメントを投稿