Python 3 環境下原生 MySQLdb(mysql-python)已停更、不支援 Python 3。主流替代方案有三:mysqlclient(C 擴充、效能最強)、PyMySQL(純 Python、相容性佳)、mysql-connector-python(Oracle 官方、純 Python)。本文對比效能、相容性、維護狀態,助你選型。
| 驅動 | 實現 | Python 3 | MySQLdb 相容 | 效能 | 維護狀態 | 推薦場景 |
|---|---|---|---|---|---|---|
| mysqlclient | C 擴充 (fork MySQLdb) | ✅ 3.3+ | ✅ 幾乎 100% | 🥇 最快 (C 層) | 活躍,Django 官方推薦 | 生產高併發、Django 專案 |
| PyMySQL | 純 Python | ✅ 完整支援 | ✅ pymysql.install_as_MySQLdb() 後透明替換 | 🥈 中等 | 活躍,OpenStack 採用 | 需 eventlet/gevent 協程、無法編譯 C 擴充環境 |
| mysql-connector-python | 純 Python | ✅ 完整支援 | ❌ API 差異較大 | 🥉 較慢 | Oracle 官方維護 | 官方支援需求、無 C 編譯器 |
| CyMySQL | PyMySQL + C 加速 | ✅ | ✅ | 介於兩者間 | 較少更新 | 折中方案 |
# Linux 需系統依賴 # Ubuntu/Debian: apt-get install python3-dev default-libmysqlclient-dev build-essential # CentOS/RHEL: yum install python3-devel mysql-devel gcc pip install mysqlclient
import MySQLdb
conn = MySQLdb.connect(host='localhost', user='root', passwd='123', db='test', charset='utf8mb4')
cursor = conn.cursor()
cursor.execute("SELECT VERSION()")
print(cursor.fetchone())
conn.close()
pip install PyMySQL
import pymysql
# 透明替換 MySQLdb(選用)
pymysql.install_as_MySQLdb()
import MySQLdb # 實際使用 PyMySQL
conn = pymysql.connect(host='localhost', user='root', password='123', db='test', charset='utf8mb4',
cursorclass=pymysql.cursors.DictCursor)
with conn.cursor() as cur:
cur.execute("SELECT * FROM users WHERE id=%s", (1,))
print(cur.fetchone())
conn.close()
pip install mysql-connector-python
import mysql.connector
conn = mysql.connector.connect(host='localhost', user='root', password='123', database='test')
cursor = conn.cursor()
cursor.execute("SELECT VERSION()")
print(cursor.fetchone())
conn.close()
mysqlclient‑x.x.x‑cp3x‑win32/amd64.whl 直接 pip install。eventlet.monkey_patch() 可實現非阻塞 IO,OpenStack 生產驗證通過。DBUtils、SQLAlchemy pool 或 HikariCP(透過 JayDeBeApi),避免頻繁建連。charset='utf8mb4',支援 emoji 與完整 Unicode。選型建議: