はじめに
この記事は以下の記事に影響を受けております。先日Pythonでバックエンドプログラムを作成していたのですが、MySQLに接続する機会がありましたのでライブラリ選定をする中で以下の記事に巡り合いました。
なお2024年現在でも StackOverflowのpopular technologies (Prodessional Developers) にてMySQLはDBの4割の知名度、Pythonは45%の知名度なのでこの組み合わせでの利用は一定数の需要があるものと思っております。
結論
お急ぎの方もいらっしゃると思いますので結果だけ載せます。
- 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を利用して質問した結果。レコメンドされたものは以下。
- mysql-connector-python
- PyMySQL
- mysqlclient
純粋に接続だけを行いたい場合はmysql-connector-pythonやPyMySQLがおすすめといわれました。
Gemini
レコメンドされたものは以下。
- mysql-connector-python
- PyMySQL
mysql-connector-pythonが最もおすすめといわれました。
Python Package Index(PyPI)
以下のサイトから主要そうな各パッケージのリリース履歴を確認してみます。
https://pypi.org/
2024年現在のリリースノートが新しい順に掲載していきます。
mysql-connector-python
version 9.0.0
最終リリース 2024/07/01
2024年現在、メンテされている。純粋なPython実装で、Oracle公式のMySQL Connectorのようです。
PyMySQL
version 1.1.1
最終リリース 2024/05/21
2024年現在、メンテされている。純粋なPython実装で、オープンソースのようです。
mysqlclient
version 2.2.4
最終リリース 2024/02/09
2024年現在、メンテされている。C言語で書かれたMySQLdbの後継実装のようで高速そうです。オープンソースのようです。
mysql-connector
version 2.2.9
最終リリース 2019/04/01
Deprecated。使用なし。
mysql-connector-python-rf
version 2.2.2
最終リリース 2017/02/04
メンテ停止。使用なし
調査まとめ
調査としては、以下の3つが選択肢として良さそうに思いました。GPT4oの回答と一致しています(すごい)。
- mysql-connector-python
- PyMySQL
- mysqlclient
2と3の比較では、Githubのスター数やフォーク数については、2024年8月現在PyMySQLがmysqlclientの約3倍の数でしたので、プログラム自体に速度面で強い制約がない場合は二つの比較ではPyMySQLが良いのでしょう。
1と2の比較では、1は「Oracle公式実装でMySQL最新版までの多様な機能をサポートしている」、2は「特定の高度なMySQL機能がサポートされていない場合があるが(基本的な用途では十分)オープンソースでコミュニティによって維持されている」という感じでしょう。
動作については2024年8月時点ではPython3.8以上を利用しておけば問題ないかと思います。
Github
Githubのリンクをそれぞれ見つけました。
mysql-connector-python
PyMySQL
mysqlclient
コード
コード面の書き方でも差はありませんでした。
mysql-connector-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
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()を使います
おわりに
主要ライブラリのうち大体2通りの選択肢になると思います。実装面でも似通っているため、最後は本当に好みになりそうです。詳しい動作性能までは確認していませんので、詳しいかたがいらっしゃったらコメントいただけると幸いです。