aiomysqlをインストールしてPythonからMySQL・MariaDBを操作する

aiomysqlをインストールしてPythonからMySQL・MariaDBを操作する プログラミング

「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.62016年12月23日2021年12月23日
3.72018年6月27日2023年6月27日
3.82019年10月14日2024年10月
3.92020年10月5日2025年10月
3.102021年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の動作確認を説明しました。

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