スキップしてメイン コンテンツに移動

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)が食べたくなりました。今日はここで失礼します。

スポンサーリンク
スポンサーリンク
スポンサーリンク

コメント

このブログの人気の投稿

axiosの使い方まとめ (GET/POST/例外処理)

axiosの使い方まとめ (GET/POST/例外処理)最近何かとよく使うJavaScriptでAJAX通信を行うaxiosについて、簡単に使い方をまとめました。GETリクエストをaxiosで送るまずはGETリクエストをaxiosで送る方法です。const res =await axios.get('/users') console.log(res.data)分割代入の記法を使うと、以下のようにも書けますconst{data}=await axios.get('/users') console.log(data)クエリパラメータ (URLパラメータ)を指定クエリパラメータを指定する方法は2つあります。1つ目は、axios.getに指定するURLに直接記述する方法です。axios.get('/user?id=123')2つめは、axios.getの第2引数に、オプション指定する方法です。axios.get('/user',{ params:{ id:123}})POSTリクエストをaxiosで送る次はPOSTリクエストをaxiosで送る方法です。JSON形式でPOSTするJSON形式でPOSTする場合は、axios.postの第2引数に、送信するデータをJavaScriptオブジェクトで指定します。const res =await axios.post('/user',{ id:123, name:'Yamada Tarou'})application/x-www-form-urlencoded形式でPOSTするapplication/x-www-form-urlencoded形式でPOSTする場合は、URLSearchParamsを使います。var params =newURLSearchParams() params.append('id',123) params.append('name','Yamada Tarou')const res =await axios.post('/user', params)axios でファイルをアップロードする画像などのファイルを、axiosでアッ…

[VB, C#] Windows 8, Window 10 で ImeModeが制御できない問題を解決する

[VB, C#] Windows 8, Window 10 で ImeModeが制御できない問題を解決するタイトルの通りですが、Windows 8 以降では Windows Form アプリケーションで、コントロールの ImeMode に Katakana や KatakanaHalf を設定しても、カタカナになってくれません。なぜ ImeMode が効かないのか?Windows 8 以降、IME Mode の切り替えは、ユーザー単位で切り替わるようになった為、アプリから IME Mode 制御が出来ないようになりました。
(IME をON にした場合、常に ひらがな モードになます)※ Windows 7までは、IME Modeの切り替えはアプリ単位で行われていた為、問題なくアプリから IME制御が行えました。対処方法Windows 8 以降、IMEの制御は、InputScope クラスの利用が推奨されています。
しかし、InputScope クラスは、WPF、Windows ストアアプリでしか使えない為、Windows Formアプリでは使用できません。
(Windows Form はもう使うな!という事でしょうか (涙) )結論としては、コントールパネルの設定で、IMEの制御をユーザ単位から アプリ単位に変更する事ができます。
これで、Windows Formアプリでも 従来通りIMEの制御を行う事が出来ます。おわりにこの方法だと、アプリをインストールする端末すべてに設定が必要となり、とっても面倒です。。。
しかし、今の所これしか方法がない状態です。
これからは Windows Formではなく、WPFや Windows ストアアプリで作れという事ですかね (^^;)

MailKitの使い方! エンコーディング指定や添付ファイをメールで送信する方法[C#/VB Tips]

MailKitの使い方! エンコーディング指定や添付ファイをメールで送信する方法[C#/VB Tips]MailKitを使ってメールを送るサンプルコードです。(C#)UTF8/iso-2022-jpのエンコーディング指定、GMail/YahooのSMTPサーバで送るなど、4つのサンプルコードでMailKitの使い方を紹介します。MailKitって何?2017年に.NET標準のSystem.Net.Mail.SmtpClientが廃止予定となり、Microsoftより今後はオープンソースライブラリである、MailKitに置き換えるとアナウンスがありました。既にSmtpClientは非推奨になっており、今後は廃止されていきます。現在、SmtpClientを使用したソースコードには、Visual StudioからMailKitを使うよう警告が出るようになっています。さっそく、MailKitを使ってメールを送信するサンプルコードを作っていきます。UTF8でメールを送信文字エンコーディングを、UTF8でメールを送信するサンプルコードです。
MailKitは、デフォルトの文字エンコーディングがUTF8なっている為、シンプルなコードでメールを送信する事ができます。var host ="<smtp server name>"; var port =25;// or 587using(var smtp =new MailKit.Net.Smtp.SmtpClient()){//SMTPサーバに接続する smtp.Connect(host, port, MailKit.Security.SecureSocketOptions.Auto);//認証が必要な場合は、以下のコメントを解除//smtp.Authenticate("<id>", "<password>");//送信するメールを作成する var mail =new MimeKit.MimeMessage(); var builder =new MimeKit.BodyBuilder(); mail.From.Add(new MimeKit.MailboxAddress("",&quo…