在 Python 里连接 MySQL 数据库时,需要依赖第三方驱动。不同驱动在兼容性、性能、安装难度上各有差异,本文介绍几种常见选择及适用场景。
1. MySQLdb(Python 2 时代常用)
MySQLdb 是早期在 Python 2 下最常用的 MySQL 驱动,基于 C 扩展,性能好,API 和 DB-API 2.0 一致。
- 适用:仅限 Python 2
- 安装:
pip install MySQL-python(Python 2 环境) - 现状:官方已不再维护,Python 3 下请改用下文中的替代品
# Python 2 示例
import MySQLdb
conn = MySQLdb.connect(host='localhost', user='root', passwd='', db='test')
cursor = conn.cursor()
cursor.execute("SELECT 1")
2. mysqlclient(推荐,Python 3 下的「正统」替代)
mysqlclient 是 MySQLdb 的 Python 3 分支,继续使用 C 扩展,兼容 DB-API 2.0,接口和 MySQLdb 几乎一致,所以从 MySQLdb 迁移成本很低。
- 适用:Python 3
- 安装:
pip install mysqlclient - 特点:性能好、和 MySQLdb API 兼容、需要本机有 MySQL 开发库(如 Windows 上可能需额外安装)
import MySQLdb # 包名仍是 MySQLdb,由 mysqlclient 提供
conn = MySQLdb.connect(
host='localhost',
user='root',
password='your_password',
database='mydb',
charset='utf8mb4'
)
cursor = conn.cursor()
cursor.execute("SELECT id, name FROM users WHERE id = %s", (1,))
rows = cursor.fetchall()
conn.close()
3. PyMySQL(纯 Python,易安装)
PyMySQL 是纯 Python 实现,不依赖 C 扩展和 MySQL 客户端库,因此 pip install PyMySQL 即可,在 Windows 或没有 MySQL 开发环境的机器上特别方便。
- 适用:Python 3(也有 Python 2 版本,但已过时)
- 安装:
pip install PyMySQL - 特点:纯 Python、安装简单、性能略逊于 mysqlclient,但对多数应用足够
import pymysql
conn = pymysql.connect(
host='localhost',
user='root',
password='your_password',
database='mydb',
charset='utf8mb4'
)
with conn.cursor() as cursor:
cursor.execute("SELECT id, name FROM users")
for row in cursor:
print(row)
conn.close()
若想在不改代码的前提下用 PyMySQL 替代 mysqlclient,可以在程序入口处执行:
import pymysql
pymysql.install_as_MySQLdb()
# 之后 import MySQLdb 实际使用的就是 PyMySQL
4. mysql-connector-python(官方驱动)
mysql-connector-python 是 Oracle 提供的官方 MySQL 连接器,纯 Python,无需本机 MySQL 库。
- 适用:Python 3
- 安装:
pip install mysql-connector-python - 特点:官方维护、纯 Python、API 与上述两种略有不同
import mysql.connector
conn = mysql.connector.connect(
host='localhost',
user='root',
password='your_password',
database='mydb'
)
cursor = conn.cursor(dictionary=True) # 返回字典形式的行
cursor.execute("SELECT * FROM users LIMIT 5")
for row in cursor:
print(row)
conn.close()
5. aiomysql(异步驱动)
在 asyncio 项目里需要异步访问 MySQL 时,可以使用 aiomysql,它基于 PyMySQL,提供异步接口。
- 适用:Python 3 + asyncio(如 aiohttp、FastAPI 等)
- 安装:
pip install aiomysql
import asyncio
import aiomysql
async def main():
conn = await aiomysql.connect(
host='localhost', user='root', password='', db='mydb'
)
async with conn.cursor() as cursor:
await cursor.execute("SELECT 1")
result = await cursor.fetchone()
conn.close()
asyncio.run(main())
6. 与 ORM(如 SQLAlchemy)配合使用
使用 SQLAlchemy 等 ORM 时,连接 MySQL 仍需指定底层驱动,常用写法如下:
| 驱动 | SQLAlchemy 连接串中的 dialect/driver 示例 |
|---|---|
| mysqlclient | mysql+mysqldb://user:pass@host/dbname |
| PyMySQL | mysql+pymysql://user:pass@host/dbname |
| mysql-connector | mysql+mysqlconnector://user:pass@host/dbname |
from sqlalchemy import create_engine
# 使用 PyMySQL 作为驱动
engine = create_engine('mysql+pymysql://user:password@localhost/mydb?charset=utf8mb4')
简要对比与选择建议
| 驱动 | Python 版本 | 实现方式 | 安装难度 | 性能 | 典型场景 |
|---|---|---|---|---|---|
| MySQLdb | 2 | C 扩展 | 中 | 高 | 仅旧项目 |
| mysqlclient | 3 | C 扩展 | 中(需依赖) | 高 | 新项目、追求性能 |
| PyMySQL | 3 | 纯 Python | 低 | 中 | 快速上手、无 C 依赖 |
| mysql-connector-python | 3 | 纯 Python | 低 | 中 | 偏好官方驱动 |
| aiomysql | 3 | 纯 Python | 低 | 中 | 异步/高并发 |
- 一般 Web 或脚本:优先考虑 mysqlclient(能装上的话)或 PyMySQL。
- Windows 或不想装 MySQL 开发库:用 PyMySQL 或 mysql-connector-python。
- 异步框架:用 aiomysql。
- 从旧项目 MySQLdb 迁移到 Python 3:用 mysqlclient 可几乎不改代码。
以上是 Python 中常用 MySQL 驱动包的简要介绍,可按项目环境和需求选用其一即可。