「PythonからMySQL・MariaDBにアクセスしたい」
「DBアクセスを並列で行いたい」
このような場合には、aiomysqlがおススメです。
この記事では、aiomysqlのついて解説しています。
本記事の内容
- aiomysqlとは?
- aiomysqlのシステム要件
- aiomysqlのインストール
- aiomysqlの動作確認
それでは、上記に沿って解説していきます。
aiomysqlとは?
aiomysqlとは、非同期でMySQL・MariaDBにアクセスするためのPythonライブラリです。
非同期による処理は、asyncioを利用しています。
asyncioは、async/await構文を使い並行処理のコードを書くためのライブラリです。
asyncio自体は、Pythonの標準ライブラリに含まれています。
そのため、別途インストールなどは不要です。
また、aiomysqlは内部的にはPyMySQLを利用しています。
PyMySQLの利用により、データベースへのアクセスを行っています。
PyMySQLについては、次の記事で説明しています。
なお、個別にPyMySQLをインストールする必要はありません。
aiomysqlのインストール時に、最適なバージョンのPyMySQLが自動的にインストールされます。
以上、aiomysqlについて説明しました。
次は、aiomysqlのシステム要件を説明します。
aiomysqlのシステム要件
現時点(2022年7月)でのaiomysqlの最新バージョンは、0.1.1となります。
この最新バージョンは、2022年5月9日にリリースされています。
サポートOSに関しては、次のように記載されています。
簡単に言うと、Linuxでのみ動くということです。
なかなか割り切っていますね。
サポート対象となるPythonのバージョンは、以下となっています。
- Python 3.7
- Python 3.8
- Python 3.9
- Python 3.10
このサポート状況は、以下のPython公式開発サイクルに一致しています。
バージョン | リリース日 | サポート期限 |
3.6 | 2016年12月23日 | 2021年12月23日 |
3.7 | 2018年6月27日 | 2023年6月27日 |
3.8 | 2019年10月14日 | 2024年10月 |
3.9 | 2020年10月5日 | 2025年10月 |
3.10 | 2021年10月4日 | 2026年10月 |
Python 3.6は2021年末でサポート終了であることに注意してください。
以上、aiomysqlのシステム要件を説明しました。
次は、aiomysqlのインストールを説明します。
aiomysqlのインストール
検証は、次のバージョンの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
では、aiomysqlのインストールです。
aiomysqlのインストールは、以下のコマンドとなります。
pip install aiomysql
aiomysqlのインストールは、すぐに終わります。
終了したら、どんなパッケージがインストールされたのかを確認します。
$ pip list Package Version ---------- ------- aiomysql 0.1.1 pip 22.1.2 PyMySQL 1.0.2 setuptools 63.1.0 wheel 0.36.2
依存するパッケージには、PyMySQLがあります。
PyMySQLにより、PythonからMySQL・MariaDBへの接続を実現しています。
以上、aiomysqlのインストールを説明しました。
次は、aiomysqlの動作確認を説明します。
aiomysqlの動作確認
aiomysqlの動作確認を行います。
テーブルにあるデータを照会する動作を確認してみましょう。
その際には、次のサンプルデータベースを利用します。
その中から、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 | +------+------------+-------------+----------+------------+
aiomysqlを使って、同じように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の動作確認を説明しました。