はじめに
こんにちは。
今回はPythonの環境でMySQLデータベースから簡単にデータを取得するライブラリであるPyMySQLについてお伝えしていこうと思います。
PythonでMySQLを使いたい
そもそもPythonでデータベースを扱いたい時はどんな時なのか?
- Webアプリケーション
- バッチ処理
- その他システム etc.
基本的にはこんなところかなと思います。(おそらく僕が知らなくてPythonでデータベースを使いたくなるシチュエーションなんてたくさんある…)
その中でも僕が今回直面したのは「バッチ処理」です。
Python環境で「その他システム」や「Webアプリケーション」を構築したいときは、基本的にFlaskやDjangoなどのWebフレームワークを使うと思います。
そんなWebアプリケーションとMySQLなどのRDBと相性が良く、使いやすいのはSQLAlchemyなどのパッケージではないでしょうか。
SQLAlchemyは、いわゆるORM(Object Relational Mapper)と呼ばれるクラスとテーブルをマッピングしてくれる仲介ツールで、オブジェクト指向開発などによく用いられます。
一方で、ちょっとしたバッチ処理や、「実行環境的にクラスとかを作って実施するのは難しい」、「Mapperまでは使わなくても良いが、PythonからSQL叩きたい」などの時にSQLAlchemyは少し十分すぎて、逆に扱いづらい。
そんな時にオススメなのがPyMSQL。
今回はPyMySQLについて、その特徴と簡単な使い方を、おすすめのシチュエーションも交えてお伝えしていければなと思います。
PyMySQL
PyMySQLとは
一言で言うと「Python環境上で扱える純粋なMySQLクライアント」になります。
一般的にMySQLなどのデータベースのアクセスにはアクセス用にクライアントサービスを使います。
CLIからアクセスする場合にも、アクセスする元となる端末などにMySQLクライアントをインストールし、そのクライアント上からコマンドなどを送ることでデータベースを操作することができるのです。
例えばLinuxOS上では「mysql-community-client」と言うクライアントパッケージが提供されており、インストールすることでmysqlコマンdのと共に、任意のMySQLデータベースにアクセスすることができるようになります。
PyMySQLとは上記のPython環境版、つまりPythonのソースコード上からデータベースへの操作命令を送れるパッケージなのです。
そのほか、Python環境からMySQLに接続するパッケージとしては下記のようなものがあるが、こちらの比較紹介ページから分かるように、PyMySQLが最もよさそうと言うことがわかります。
- mysql-connector
- mysql-connector-python
- mysql-connector-python-repackaged
- mysql-connector-python-rf
PyMySQLが活躍する場所
PythonとMySQLを扱う環境であれば、正直どこでも使えるのですが、前述したSQLAlchemyなどもあるため、Webアプリケーション開発においてはORMとして提供されているSQLAlchemyなどが使い勝手的には優勢だと思われます。
それではPyMySQLが最も活躍する環境とはどこなのでしょうか。
それはFaaS(Function as a Service)です。
FaaSと聞いて一番最初に思い浮かぶのはAWS LambdaやAzure Functionsでしょうか。
AWS LambdaもAzure Functionsもどちらもイベント駆動型のサーバレスコンピューティングサービスで、Pythonを時はじめNode.jsなどの言語で定義した「関数」の処理だけをイベント駆動で実行するサービスになります。
さて、このFaaSとPyMySQLが相性バッチリな理由ですが、軽量、記述が楽と言う点ですね。
PyMySQLの準備
今回はサーバ上で実行するPython環境と、FaaS上(今回はAWS Lmbda)上で実行するPython環境の2つの環境について、若干準備が異なるためそれぞれご紹介します。
サーバへの導入
サーバ駆動のPython環境への導入はPythonのその他のパッケージと同様に下記コマンドで導入してください。
pip install PyMySQL
# Optional 1
pip install PyMySQL[rsa]
# Optional 2
pip install PyMySQL[ed25519]
オプション1はsha256による暗号パスワードを利用する際の追加パッケージ。
オプション2はMariaDBで利用できるed25519による認証方法を利用するた際に必要になる追加パッケージ。
FaaS(AWS Lambda)への導入
AWS LambdaへのPyMySQL導入
工事中…..
PyMySQLの使い方
データベースホストとの接続
import pymysql
db = pymysql.connect(host=<MYSQL_HOST_ENDPOINT>,
user=<DB_ACCESS_USER>,
password=<DB_ACCESS_PASS>,
cursorclass=<CURSOR_CLASS>
database=<DATABASE_NAME>)
cursor = db.cursor()
<MYSQL_HOST_ENDPOINT>
データベースの提供エンドポイントのことです。
EX. localhost
<DB_ACCESS_USER>
DBへのアクセスユーザーのことです。
<DB_ACCESS_PASS>
DBへのアクセスパスワードのことです。
<CURSOR_CLASS>
PyMySQLで提供されている、データベースからのレスポンス型を定義します。
- 辞書型で返して欲しい場合:pymysql.cursors.DictCursor
- タプル形式:pymysql.cursors.Cursor or 何も指定しない
- その他(非常でデータが大きいとき):pymysql.cursors.SSCursor, pymysql.cursors.SSDictCursor※SSDictCursorおよびSSCursorは取得データ量が非常に大きい時などに用いるため、一般的には使わない
<DATABASE_NAME>
アクセス先のデータベースのことです。
こちらは接続時に記述指定しなくても、後ほど説明するコマンド実行の際に”USER <DATABASE_NAME>”を指定してもよい。
SELECT命令
with db:
with db.cursor() as cursor:
sql = "SELECT * FROM <TABLE_NAME> WHERE '<COLUMN_1>'=<CONDITION_1>"
cursor.execute(sql)
result = cursor.fetchall()
上記は簡易的なSQL分の書き方です。
もっと汎用的にSQL分を使いまわしたい時には下記のように書くと良いでしょう。
with db:
with db.cursor() as cursor:
sql = "SELECT * FROM WHERE '<COLUMN_1>'=%s"
cursor.execute(sql, (<CONDITION_1>))
result = cursor.fetchall()
INSERT, DELETE, UPDATE命令
with db:
with db.cursor() as cursor:
try:
sql = "INSERT INTO '<TABLE_NAME>' ('<COLUMN_1>', '<COLUMN_1>') VALUES ('<VALUE_1>', '<VALUE_2>')"
cursor.execute(sql)
db.commit()
except Exception as e:
db.rollback()
raise e
PyMySQLは自動でコミットをしないので、データベースに変更などあった場合はcommit()関数を必ず実行しましょう。
終わりに
いかがだったでしょうか。
FaaS上でのPythonとMySQL、この環境をうまく繋いでくれる便利なパッケージ「PyMySQL」、ぜひFaaSでの開発をご検討の方は参考にしてみてください。
何かありましたらお問合せページからご連絡いただけますと幸いです。
Shohei