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

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

「PythonからMySQL・MariaDBに接続したい」
「データベース処理の速度を重視したシステムを考えている」
「aiomysqlより高速なドライバを探している」

このような場合には、asyncmyがオススメです。
この記事では、asyncmyについて解説しています。

本記事の内容

  • asyncmyとは?
  • asyncmyのシステム要件
  • asyncmyのインストール
  • asyncmyの動作確認

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

asyncmyとは?

asyncmyは、MySQL・MariaDBのドライバです。
また、asyncmyはaiomysqlとPyMySQLの大部分を再利用しています。

aiomysqlについては、次の記事で説明しています。

簡単に言うと、asyncmyはaiomysqlを高速化したドライバです。
asyncmyがどれだけ速いのかは、次のベンチマークの結果をご覧ください。

最速(selectで差が出る)は、mysqlclientと言えます。
mysqlclientは、MySQLの共有ライブラリであるlibmysqlclientを利用していますからね。

mysqlclientについては、次の記事で説明しています。

そして、asyncmyはmysqlclientの次に高速だと言えます。
高速化を実現できている理由は、Cythonでコードを書き換えているからです。

以上、asyncmyについて説明しました。
次は、asyncmyのシステム要件を説明します。

asyncmyのシステム要件

現時点(2022年7月)でのasyncmyの最新バージョンは、0.2.5となります。
この最新バージョンは、2022年3月30日にリリースされています。

asyncmyのシステム用件は、基本的にはaiomysqlと同じです。
そのため、サポートOSに関しては同じく以下となります。

Linuxで動くと捉えればよいでしょう。
サポート対象となるPythonのバージョンは、以下となっています。

  • Python 3.7
  • Python 3.8
  • Python 3.9
  • Python 3.10

これもaiomysqlと同じです。

以上、asyncmyのシステム要件を説明しました。
次は、asyncmyのインストールを説明します。

asyncmyのインストール

検証は、次のバージョンのPythonで行います。

$ python -V
Python 3.10.2

まずは、現状のインストール済みパッケージを確認しておきます。

$ pip list
Package    Version
---------- -------
pip        22.1.2
setuptools 63.1.0
wheel      0.36.2

次にするべきことは、pipとsetuptoolsの更新です。
pipコマンドを使う場合、常に以下のコマンドを実行しておきましょう。

python -m pip install --upgrade pip setuptools

では、asyncmyのインストールです。
asyncmyのインストールは、以下のコマンドとなります。

pip install asyncmy

asyncmyのインストールは、一瞬で終わります。
終了したら、どんなパッケージがインストールされたのかを確認します。

$ pip list
Package    Version
---------- -------
asyncmy    0.2.5
pip        22.1.2
setuptools 63.1.0
wheel      0.36.2

依存するパッケージは、存在していません。
これであれば、既存環境へは影響を与えずにasyncmyを導入できます。

以上、asyncmyのインストールを説明しました。
次は、asyncmyの動作確認を説明します。

asyncmyの動作確認

asyncmyの動作確認を行います。
テーブルにあるデータを照会する動作を確認してみましょう。

その際には、次のサンプルデータベースを利用します。

その中から、cityテーブルを利用します。
テーブル定義は、以下。

```
mysql> DESC city;
+-------------+----------+------+-----+---------+----------------+
| Field       | Type     | Null | Key | Default | Extra          |
+-------------+----------+------+-----+---------+----------------+
| ID          | int(11)  | NO   | PRI | NULL    | auto_increment |
| Name        | char(35) | NO   |     |         |                |
| CountryCode | char(3)  | NO   | MUL |         |                |
| District    | char(20) | NO   |     |         |                |
| Population  | int(11)  | NO   |     | 0       |                |
+-------------+----------+------+-----+---------+----------------+
```

cityには、全部で4079件のデータが登録されています。

mysql> SELECT COUNT(*) FROM city;
+----------+
| COUNT(*) |
+----------+
|     4079 |
+----------+

次の条件により、5レコードを抽出可能です。

mysql> select * from city where CountryCode = 'JPN' AND District = 'Fukuoka';
+------+------------+-------------+----------+------------+
| ID   | Name       | CountryCode | District | Population |
+------+------------+-------------+----------+------------+
| 1539 | Fukuoka    | JPN         | Fukuoka  |    1308379 |
| 1542 | Kitakyushu | JPN         | Fukuoka  |    1016264 |
| 1623 | Kurume     | JPN         | Fukuoka  |     235611 |
| 1681 | Omuta      | JPN         | Fukuoka  |     142889 |
| 1753 | Kasuga     | JPN         | Fukuoka  |     101344 |
+------+------------+-------------+----------+------------+

asyncmyを使って、同じように5レコード抽出してみましょう。
その際に利用するコードは、以下。

import asyncio
import aiomysql

loop = asyncio.new_event_loop()


async def test_example():
    conn = await aiomysql.connect(host='localhost', port=3306,
                                  user='tester', password='testpass', db='world',
                                  loop=loop)

    cur = await conn.cursor()
    await cur.execute("select * from city where CountryCode = 'JPN' AND District = 'Fukuoka';")
    result = await cur.fetchall()

    for target in result:
        print(target)

    await cur.close()
    conn.close()


loop.run_until_complete(test_example())

データベースの接続情報は、各自の環境に合わせて変更してください。
上記コードを実行した結果は、以下。

(1539, 'Fukuoka', 'JPN', 'Fukuoka', 1308379)
(1542, 'Kitakyushu', 'JPN', 'Fukuoka', 1016264)
(1623, 'Kurume', 'JPN', 'Fukuoka', 235611)
(1681, 'Omuta', 'JPN', 'Fukuoka', 142889)
(1753, 'Kasuga', 'JPN', 'Fukuoka', 101344)

上記の動作確認用のコードは、aiomysqlの動作確認のコードを全く同じです。
そして、結果も同じとなります。

以上、asyncmyの動作確認を説明しました。

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