2024年版 MySQLに接続するライブラリ(Python)

## はじめに

この記事は以下の記事に影響を受けております。先日Pythonでバックエンドプログラムを作成していたのですが、MySQLに接続する機会がありましたのでライブラリ選定をする中で以下の記事に巡り合いました。

https://qiita.com/nanbuwks/items/a990ad5dac8bbe888761

なお2024年現在でも StackOverflowのpopular technologies (Prodessional Developers) にてMySQLはDBの4割の知名度、Pythonは45%の知名度なのでこの組み合わせでの利用は一定数の需要があるものと思っております。

https://survey.stackoverflow.co/2024/technology#most-popular-technologies-language-prof

## 結論

お急ぎの方もいらっしゃると思いますので結果だけ載せます。

:::note info


- mysql-connector-python
    - MySQLの最新版に追従する多様な機能を使いたい場合かつOracle公式の実装の方が好ましい場合
- PyMySQL
    - MySQLの一般的な機能で十分な場合（余分な実装は不要）かつオープンソースコミュニティを好む場合
- mysqlclient
    - 特殊な性能要件を必要とし、上記ライブラリを選定できかねる場合

:::

mysql-connector-pythonとPyMySQLのどちらが良いかは好みもあるかと思います。導入はどちらもpipで可能です。

mysql-connector-pythonの導入方法

```
pip install mysql-connector-python
```

PyMySQLの導入方法

```
pip install PyMySQL
```



## ネットを使った調査

AIに調査してみた結果およびPyPIでのリリースを比較してみます。なおORMのSQLAlchemyは含めません。

### ChatGPT

GPT4oを利用して質問した結果。レコメンドされたものは以下。

1. mysql-connector-python
2. PyMySQL
3. mysqlclient

純粋に接続だけを行いたい場合はmysql-connector-pythonやPyMySQLがおすすめといわれました。

### Gemini

レコメンドされたものは以下。

1. mysql-connector-python
2. PyMySQL

mysql-connector-pythonが最もおすすめといわれました。

### Python Package Index（PyPI）

以下のサイトから主要そうな各パッケージのリリース履歴を確認してみます。
https://pypi.org/

2024年現在のリリースノートが新しい順に掲載していきます。


https://pypi.org/project/mysql-connector-python/

**mysql-connector-python**
version 9.0.0
最終リリース 2024/07/01
2024年現在、メンテされている。純粋なPython実装で、Oracle公式のMySQL Connectorのようです。

https://pypi.org/project/PyMySQL/

**PyMySQL**
version 1.1.1
最終リリース 2024/05/21
2024年現在、メンテされている。純粋なPython実装で、オープンソースのようです。

https://pypi.org/project/mysqlclient/

**mysqlclient**
version 2.2.4
最終リリース 2024/02/09
2024年現在、メンテされている。C言語で書かれたMySQLdbの後継実装のようで高速そうです。オープンソースのようです。


https://pypi.org/project/mysql-connector/

mysql-connector 
version 2.2.9
最終リリース 2019/04/01
Deprecated。使用なし。

https://pypi.org/project/mysql-connector-python-rf/

mysql-connector-python-rf 
version 2.2.2
最終リリース 2017/02/04
メンテ停止。使用なし


### 調査まとめ

調査としては、以下の３つが選択肢として良さそうに思いました。GPT4oの回答と一致しています（すごい）。

1. mysql-connector-python
2. PyMySQL
3. mysqlclient

2と3の比較では、Githubのスター数やフォーク数については、2024年8月現在PyMySQLがmysqlclientの約3倍の数でしたので、プログラム自体に速度面で強い制約がない場合は二つの比較ではPyMySQLが良いのでしょう。

1と2の比較では、1は「Oracle公式実装でMySQL最新版までの多様な機能をサポートしている」、2は「特定の高度なMySQL機能がサポートされていない場合があるが（基本的な用途では十分）オープンソースでコミュニティによって維持されている」という感じでしょう。

:::note warn
動作については2024年8月時点ではPython3.8以上を利用しておけば問題ないかと思います。
:::


## Github

Githubのリンクをそれぞれ見つけました。

mysql-connector-python

https://github.com/mysql/mysql-connector-python

PyMySQL

https://github.com/PyMySQL/PyMySQL

mysqlclient

https://github.com/PyMySQL/mysqlclient

## コード

コード面の書き方でも差はありませんでした。

mysql-connector-python



```python

import mysql.connector

conn = mysql.connector.connect(
    host="your_host",
    user="your_user",
    password="your_password",
    database="your_database"
)

cursor = conn.cursor()
cursor.execute("SELECT * FROM your_table")
for row in cursor.fetchall():
    print(row)

cursor.close()
conn.close()


```

PyMySQL

```python

import pymysql

conn = pymysql.connect(
    host="your_host",
    user="your_user",
    password="your_password",
    database="your_database"
)

cursor = conn.cursor()
cursor.execute("SELECT * FROM your_table")
for row in cursor.fetchall():
    print(row)

cursor.close()
conn.close()

```

基本的にインスタンス変数やメソッド名も似通っていますが、違いも多少あるようでした。

- 接続: 基本的な接続方法は似ていますが、エラーハンドリングの部分で異なる例外クラスを使用します（mysql.connector.Error vs pymysql.err.MySQLError）
- トランザクション: トランザクションの開始方法とコミット/ロールバックの処理方法に違いがあります。mysql-connector-pythonはconn.autocommit = Falseを使い、PyMySQLはconn.begin()を使います


## おわりに

主要ライブラリのうち大体２通りの選択肢になると思います。実装面でも似通っているため、最後は本当に好みになりそうです。詳しい動作性能までは確認していませんので、詳しいかたがいらっしゃったらコメントいただけると幸いです。