【Python】Pythonで簡単にMySQLアクセスする方法(PyMySQL)

Python Python
Python

はじめに

こんにちは。
今回は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 LambdaAzure Functionsでしょうか。

    AWS LambdaAzure 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

    タイトルとURLをコピーしました