【PyMySQL】PythonでMySQL(MariaDB)に接続する

【PyMySQL】PythonでMySQL(MariaDB)に接続する プログラミング

プログラミングを行う上では、データベースへの接続は避けては通れません。
避けて通れないと言っても、Pythonなら簡単です。

PyMySQLライブラリを使えば、簡単にMySQL・MariaDBに接続できます。
もちろん、Windows・macOS・LinuxなどのOSは問いません。

この記事では、この便利なPyMySQLに関して解説しています。

本記事の内容

  • PyMySQLのシステム要件
  • PyMySQLのインストール
  • PyMySQLの動作確認

それでは、上記に沿って解説していきます。

PyMySQLのシステム要件

2021年1月時点のPyMySQLの最新バージョンは、0.10.1となります。
PyMySQL 0.10.1は、2020年9月10日にリリースされています。

システム要件としてのポイントは、以下の2つ。

  • Python
  • MySQL(MariaDB)

以下で説明します。

Python

サポートしているPythonのバージョンは、以下。

  • Python 2.7
  • Python 3.5
  • Python 3.6
  • Python 3.7
  • Python 3.8
  • Python 3.9

一般的に利用されているPythonであれば、基本的には問題ありません。
PyMySQLは、データベース接続というシステムの根本的な部分に関わるライブラリです。

そのため、一部バージョンのみ対応という訳にはいかないのでしょう。
もちろん、その分だけコードは膨らみます。

結果的には、その分だけパフォーマンスは落ちてしまいます。
でも、これは仕方がないでしょうね。

バージョン確認

Pythonのバージョンを確認しておきます。

>python -V
Python 3.8.6

サポート対象内であり、Pythonのバージョンは問題ありません。

MySQL(MariaDB)

MySQLとMariaDBともに、バージョンが5.5以降がサポート対象となります。
ここで言うバージョンが意外と混乱を引き起こします。

その混乱に関しての詳細は、次の記事で解説しています。

重要なのは、MySQLサーバーとMariaDBサーバーのバージョンです。
決して、クライアント側のMySQLやMariaDBではありません。

バージョン確認

サーバーに入って確認しておきます。
勘違いしないようにしてください。

$ mysqld --version
mysqld  Ver 10.5.8-MariaDB-1:10.5.8+maria~bionic for debian-linux-gnu on x86_64 (mariadb.org binary distribution)

MariaDBのバージョン10.5.8です。
5.5以降であり、バージョン的には問題ありません。

PyMySQLのインストール

pipコマンドでインストールします。
pipコマンドを使う際には、以下を事前に実行してください。

python -m pip install --upgrade pip

おまじないレベルで上記コマンドを流してください。
結構高い頻度でpip自体の更新が行われています。

では、PyMySQLをインストールします。
PyMySQLをインストールするコマンドは、以下。

pip install PyMySQL

問題なくインストールが完了しました。

Successfully installed PyMySQL-0.10.1

最新バージョンのPyMySQL 0.10.1がインストールされました。
最後に、このインストールが正しく実施されたかどうかを確認しましょう。

PyMySQLの動作確認

公式ページ上の例を利用します。
https://pypi.org/project/PyMySQL/
https://github.com/PyMySQL/PyMySQL/

載せられているサンプルコードは、データ登録です。
いきなりINSERT文の実行となります。

まあ、ちまちまとSELECT文でデータを取得するよりはいいかもしれません。
INSERT文が実行できれば、実際にテーブルにデータが増えることになります。
動作確認という意味では、ベストなサンプルコードと言えます。

そのサンプルコードを実行する前に、事前準備が必要です。
最初に、データベースを作成しておきます。
「mytest」という適当なデータベース名です。

MariaDB [(none)]> CREATE DATABASE mytest;
Query OK, 1 row affected (0.000 sec)

mytestデータベースに接続。

MariaDB [(none)]> USE mytest;
Database changed

その上で、以下のクエリでテーブルを作成。

MariaDB [mytest]> CREATE TABLE `users` (
    ->     `id` int(11) NOT NULL AUTO_INCREMENT,
    ->     `email` varchar(255) COLLATE utf8_bin NOT NULL,
    ->     `password` varchar(255) COLLATE utf8_bin NOT NULL,
    ->     PRIMARY KEY (`id`)
    -> ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin
    -> AUTO_INCREMENT=1 ;
Query OK, 0 rows affected (0.020 sec)

もちろん、この状態のテーブルは空です。

MariaDB [mytest]> SELECT * FROM users;
Empty set (0.000 sec)

事前準備が完了しました。
では、下記のコードを実行します。

import pymysql.cursors

# Connect to the database
connection = pymysql.connect(host='サーバーのIP',
                             user='DBユーザー',
                             password='パスワード',
                             db='データベース名(今回はmytest)',
                             charset='utf8mb4',
                             cursorclass=pymysql.cursors.DictCursor)

try:
    with connection.cursor() as cursor:
        # Create a new record
        sql = "INSERT INTO `users` (`email`, `password`) VALUES (%s, %s)"
        cursor.execute(sql, ('webmaster@python.org', 'very-secret'))

    # connection is not autocommit by default. So you must commit to save
    # your changes.
    connection.commit()

    with connection.cursor() as cursor:
        # Read a single record
        sql = "SELECT `id`, `password` FROM `users` WHERE `email`=%s"
        cursor.execute(sql, ('webmaster@python.org',))
        result = cursor.fetchone()
        print(result)
finally:
    connection.close()

サンプルコードで変更するのは、以下の4か所。

connection = pymysql.connect(host='サーバーのIP',
                             user='DBユーザー',
                             password='パスワード',
                             db='データベース名(今回はmytest)',

hostに関しては、同じマシン上なら「localhost」でOKです。
プログラムを実行した結果は、以下。

{'id': 1, 'password': 'very-secret'}

成功したような表示です。
では、データベースの方を確認します。

MariaDB [mytest]> select * from users;
+----+----------------------+-------------+
| id | email                | password    |
+----+----------------------+-------------+
|  1 | webmaster@python.org | very-secret |
+----+----------------------+-------------+
1 row in set (0.000 sec)

ちゃんとデータが登録されていますね。
ここまで確認できれば、PyMySQLの動作確認は完了です。

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