Python访问MySQL:PyMySQL与mysqlclient的选择与事务处理

林舟
林舟
发布时间:2026-10-11| 2人浏览过
原创

本文详解Python访问MySQL的两种主流方式:PyMySQL与mysqlclient。对比两者在Python 3环境下的安装、导入及兼容性差异,演示基于PEP-0249标准实现无缝切换,并深入解析利用事务机制处理DML语句的提交与回滚逻辑,帮助开发者构建稳健的数据库交互代码。

Python连接MySQL的两种主流方案

在Python 3时代,访问MySQL数据库主要有两种选择:纯Python实现的PyMySQL和基于C扩展的mysqlclient。早期的mysql-python库因不再维护,已被mysqlclient取代;而Umysql和Oursql等库则停留在Python 2时代,不再推荐使用。

安装与导入差异

两种库的安装命令均通过pip执行,但导入方式不同:

  • PyMySQL:安装命令为 pip install PyMySQL,导入方式为 import pymysql。
  • mysqlclient:安装命令为 pip install mysqlclient,导入方式为 import MySQLdb。

兼容性与标准遵循

两者均遵循Python Database API specification v2.0(即PEP-0249),这意味着它们的API接口几乎完全一致。开发者无需修改核心业务代码,仅需更改导入的模块名即可在两者间切换。

  • PyMySQL:明确支持Python 2.7及>=3.4,并支持最新版本的MySQL和MariaDB。
  • mysqlclient:同样支持Python 2.7及>=3.4,推荐MySQL 5.0或更新版本,对MySQL 3.23至5.5也提供支持,且描述中表明MariaDB也可工作。

数据查询与结果处理

由于遵循同一标准,两者的查询逻辑高度相似,主要区别在于结果返回格式的配置。

元组形式返回(默认)

使用PyMySQL时,默认以元组形式返回查询记录。以下示例展示了如何连接数据库、执行查询并获取结果:

>>> import pymysql
>>> db = pymysql.connect(
  host = 'localhost',
  user = 'xufive',
  password = '********',
  db = 'demo',
  charset = 'utf8'
)
>>> cursor = db.cursor()
>>> cursor.execute('select * from member where id = %s', (100,))
1
>>> print(cursor.fetchall())
((100, '370103********0012', '*9EE8E3304D69C3E9260F19C224EA5852129BF030', '王茁洋', '男', datetime.date(****, **, **), '', '济南', '济南泉景小学', '186********', Decimal('1812.50')),)
>>> cursor.close()
>>> db.close()

字典形式返回

若需以字典形式返回结果,使用mysqlclient时需指定 cursorclass 参数。切换至PyMySQL时,只需将导入改为 import pymysql,并相应调整连接参数即可实现相同功能:

>>> import MySQLdb.cursors
>>> db = MySQLdb.connect(
  host = 'localhost',
  user = 'xufive',
  password = '********',
  db = 'demo', 
  charset = 'utf8',
  cursorclass = MySQLdb.cursors.DictCursor
)
>>> with db.cursor() as cursor:
  sql = 'select * from member where id = %s'
  cursor.execute(sql, (100,))
  print(cursor.fetchall())
 1
({'id': 100, 'idcard': '370103********0012', 'passwd': '*9EE8E3304D69C3E9260F19C224EA5852129BF030', 'name': '王茁洋', 'sex': '男', 'birthday': datetime.date(****, **, **), 'title': '', 'address': '济南', 'club': '济南泉景小学', 'phone': '186********', 'rating': Decimal('1812.50')},)

事务处理与回滚机制

事务(Transaction)将一组DML(Data Manipulation Language,包括insert、update、delete)语句组合成一个逻辑单元。事务操作具有原子性:要么全部执行成功并提交,若其中任何一步出错,则回退到事务开始前的状态。

事务回滚示例

以下代码演示了如何使用PyMySQL实现典型的事务回滚逻辑。通过 try...except 结构捕获异常,确保在DML操作失败时调用 db.rollback() 恢复数据状态:

>>> import pymysql
>>> db = pymysql.connect(
  host = 'localhost',
  user = 'xufive',
  password = '********',
  db = 'demo',
  charset = 'utf8'
)

def transaction(db):
  try:
    db.begin()
    # 此处加入出错之后需要回滚的DML(insert、update、delete)语句
    db.commit()
    return True
  except:
    db.rollback()
    return False  

以上就是Python访问MySQL的正确姿势的详细内容,更多关于Python数据库连接与事务处理资料的关注本站其它相关文章!

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。