「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の動作確認を説明しました。