SqlAlchemyで任意の文字列でSQL文を実行する(生SQLの実行)

2019年4月16日火曜日

Python SQLAlchemy

t f B! P L

SqlAlchemyで任意の文字列でSQL文を実行する(生SQLの実行)

この記事では、PythonのSqlAlchemyで生のSQL文(任意の文字列のSELECTやINSERT文)を実行する方法を紹介します。

SqlAlchemyはPythonのORMで便利です。ただ複雑な結合・集計などがあるSQL(SELECT文)をORMで表現すると、ソースが難解になり、逆に普通にSQLを書いたほうが綺麗になる時があります。

今回はそんな時に役立つ、SqlAlchemyで生SQLを実行する方法を紹介します。

SqlAlchemyで任意の文字列でSQL文を実行する(生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)が食べたくなりました。今日はここで失礼します。

スポンサーリンク

QooQ