Python3 使用 PyMySQL 连接 MySQL 数据库完整指南

山间有风
山间有风
发布时间:2026-10-15| 4人浏览过
原创

本文详细介绍如何在 Python3 中使用 PyMySQL 库连接 MySQL 数据库,涵盖从环境安装、建立连接到执行增删改查及事务处理的完整流程。通过具体代码示例,演示如何创建表、插入数据、查询记录、更新与删除操作,并解析事务的 ACID 特性及错误处理机制,帮助开发者快速掌握 Python 操作 MySQL 的核心技能。

本文主要介绍如何在 Python3 环境下利用 PyMySQL 库连接 MySQL 数据库,并演示基础的增、删、改、查操作。

什么是 PyMySQL?

PyMySQL 是专为 Python3.x 设计的 MySQL 服务器连接库,而在早期的 Python2 版本中,通常使用的是 mysqdb 库。

该库严格遵循 Python 数据库 API v2.0 规范,并内置了纯 Python 编写的 MySQL 客户端库,无需依赖额外的 C 扩展。

PyMySQL 安装

在开始使用 PyMySQL 之前,请确保您的开发环境中已经正确安装了该库。

PyMySQL 的官方下载地址为:https://github.com/PyMySQL/PyMySQL。

若尚未安装,可通过以下命令安装最新版本的 PyMySQL:


$ pip3 install PyMySQL

如果您的系统环境不支持 pip 命令,可以尝试以下替代安装方式:

1、通过 git 命令克隆并下载安装包进行安装(您也可以手动下载源码包):


$ git clone https://github.com/PyMySQL/PyMySQL
$ cd PyMySQL/
$ python3 setup.py install

2、若需指定特定版本号,可使用 curl 命令进行安装:


$ # X.X 为 PyMySQL 的版本号
$ curl -L https://github.com/PyMySQL/PyMySQL/tarball/pymysql-X.X | tar xz
$ cd PyMySQL*
$ python3 setup.py install
$ # 现在你可以删除 PyMySQL* 目录

注意:执行上述安装命令时,请确保您拥有系统的 root 权限。

在安装过程中,如果遇到 "ImportError: No module named setuptools" 错误提示,表明系统中未安装 setuptools。您可以访问 https://pypi.python.org/pypi/setuptools 查找适用于您操作系统的安装方法。

以下是 Linux 系统下的安装示例:


$ wget https://bootstrap.pypa.io/ez_setup.py
$ python3 ez_setup.py

数据库连接

在尝试连接数据库之前,请确认已满足以下条件:

  • 您已在 MySQL 中创建了名为 TESTDB 的数据库。
  • 在 TESTDB 数据库中,您已经创建了名为 EMPLOYEE 的数据表。
  • EMPLOYEE 表包含以下字段:FIRST_NAME, LAST_NAME, AGE, SEX 和 INCOME。
  • 连接 TESTDB 数据库所使用的用户名为 "testuser",密码为 "test123"。您也可以根据实际需求自行设定用户名和密码,或者直接使用 root 用户及其密码。若需为用户授权,请使用 Grant 命令。
  • 您的计算机上已安装了 Python MySQLdb 模块(注:此处原文指代连接库,实际Python3中常指PyMySQL或mysqlclient,此处保留原文表述)。
  • 如果您对 SQL 语句不熟悉,建议先访问我们的 SQL基础教程进行了解。

实例:

以下代码示例展示了如何连接 MySQL 的 TESTDB 数据库:


#!/usr/bin/python3
 
import pymysql
 
# 打开数据库连接
db = pymysql.connect("localhost","testuser","test123","TESTDB" )
 
# 使用 cursor() 方法创建一个游标对象 cursor
cursor = db.cursor()
 
# 使用 execute()  方法执行 SQL 查询 
cursor.execute("SELECT VERSION()")
 
# 使用 fetchone() 方法获取单条数据.
data = cursor.fetchone()
 
print ("Database version : %s " % data)
 
# 关闭数据库连接
db.close()

执行上述脚本后,输出结果如下:

Database version : 5.5.20-log

创建数据库表

如果数据库连接成功,我们可以使用 execute() 方法来创建数据表。如下所示,我们将创建 EMPLOYEE 表:


#!/usr/bin/python3
 
import pymysql
 
# 打开数据库连接
db = pymysql.connect("localhost","testuser","test123","TESTDB" )
 
# 使用 cursor() 方法创建一个游标对象 cursor
cursor = db.cursor()
 
# 使用 execute() 方法执行 SQL,如果表存在则删除
cursor.execute("DROP TABLE IF EXISTS EMPLOYEE")
 
# 使用预处理语句创建表
sql = """CREATE TABLE EMPLOYEE (
         FIRST_NAME  CHAR(20) NOT NULL,
         LAST_NAME  CHAR(20),
         AGE INT,  
         SEX CHAR(1),
         INCOME FLOAT )"""
 
cursor.execute(sql)
 
# 关闭数据库连接
db.close()

数据库插入操作

以下实例演示如何使用 SQL INSERT 语句向 EMPLOYEE 表中插入记录:


#!/usr/bin/python3
 
import pymysql
 
# 打开数据库连接
db = pymysql.connect("localhost","testuser","test123","TESTDB" )
 
# 使用cursor()方法获取操作游标 
cursor = db.cursor()
 
# SQL 插入语句
sql = """INSERT INTO EMPLOYEE(FIRST_NAME,
         LAST_NAME, AGE, SEX, INCOME)
         VALUES ('Mac', 'Mohan', 20, 'M', 2000)"""
try:
   # 执行sql语句
   cursor.execute(sql)
   # 提交到数据库执行
   db.commit()
except:
   # 如果发生错误则回滚
   db.rollback()
 
# 关闭数据库连接
db.close()

上述例子也可以采用以下形式编写:


#!/usr/bin/python3
 
import pymysql
 
# 打开数据库连接
db = pymysql.connect("localhost","testuser","test123","TESTDB" )
 
# 使用cursor()方法获取操作游标 
cursor = db.cursor()
 
# SQL 插入语句
sql = "INSERT INTO EMPLOYEE(FIRST_NAME, \
       LAST_NAME, AGE, SEX, INCOME) \
       VALUES ('%s', '%s',  %s,  '%s',  %s)" % \
       ('Mac', 'Mohan', 20, 'M', 2000)
try:
   # 执行sql语句
   cursor.execute(sql)
   # 执行sql语句
   db.commit()
except:
   # 发生错误时回滚
   db.rollback()
 
# 关闭数据库连接
db.close()

以下代码展示了如何将变量传递给 SQL 语句:


..................................
user_id = "test123"
password = "password"

con.execute('insert into Login values( %s,  %s)' % \
             (user_id, password))
..................................

数据库查询操作

在 Python 中查询 MySQL 数据时,可以使用 fetchone() 方法获取单条数据,或使用 fetchall() 方法获取多条数据。

  • fetchone(): 该方法用于获取查询结果集中的下一条记录,返回结果为一个对象。
  • fetchall(): 该方法用于接收并返回所有的结果行。
  • rowcount: 这是一个只读属性,返回执行 execute() 方法后受影响的行数。

实例:

查询 EMPLOYEE 表中 salary(工资)字段值大于 1000 的所有数据:


#!/usr/bin/python3
 
import pymysql
 
# 打开数据库连接
db = pymysql.connect("localhost","testuser","test123","TESTDB" )
 
# 使用cursor()方法获取操作游标 
cursor = db.cursor()
 
# SQL 查询语句
sql = "SELECT * FROM EMPLOYEE \
       WHERE INCOME > %s" % (1000)
try:
   # 执行SQL语句
   cursor.execute(sql)
   # 获取所有记录列表
   results = cursor.fetchall()
   for row in results:
      fname = row[0]
      lname = row[1]
      age = row[2]
      sex = row[3]
      income = row[4]
       # 打印结果
      print ("fname=%s,lname=%s,age=%s,sex=%s,income=%s" % \
             (fname, lname, age, sex, income ))
except:
   print ("Error: unable to fetch data")
 
# 关闭数据库连接
db.close()

上述脚本执行后的结果如下:

fname=Mac, lname=Mohan, age=20, sex=M, income=2000

数据库更新操作

更新操作用于修改数据表中的数据。以下实例演示如何将 TESTDB 表中 SEX 为 'M' 的记录,其 AGE 字段值递增 1:


#!/usr/bin/python3
 
import pymysql
 
# 打开数据库连接
db = pymysql.connect("localhost","testuser","test123","TESTDB" )
 
# 使用cursor()方法获取操作游标 
cursor = db.cursor()
 
# SQL 更新语句
sql = "UPDATE EMPLOYEE SET AGE = AGE + 1 WHERE SEX = '%c'" % ('M')
try:
   # 执行SQL语句
   cursor.execute(sql)
   # 提交到数据库执行
   db.commit()
except:
   # 发生错误时回滚
   db.rollback()
 
# 关闭数据库连接
db.close()

删除操作

删除操作用于移除数据表中的数据。以下实例演示了如何删除 EMPLOYEE 表中 AGE 大于 20 的所有记录:


#!/usr/bin/python3
 
import pymysql
 
# 打开数据库连接
db = pymysql.connect("localhost","testuser","test123","TESTDB" )
 
# 使用cursor()方法获取操作游标 
cursor = db.cursor()
 
# SQL 删除语句
sql = "DELETE FROM EMPLOYEE WHERE AGE > %s" % (20)
try:
   # 执行SQL语句
   cursor.execute(sql)
   # 提交修改
   db.commit()
except:
   # 发生错误时回滚
   db.rollback()
 
# 关闭连接
db.close()

执行事务

事务机制能够确保数据的一致性。

事务必须具备四个属性,通常称为 ACID 特性:原子性、一致性、隔离性、持久性。

  • 原子性(atomicity)。一个事务被视为一个不可分割的工作单元,事务中包含的所有操作要么全部执行成功,要么全部不执行。
  • 一致性(consistency)。事务必须使数据库从一个一致状态变换到另一个一致状态。一致性通常与原子性密切相关。
  • 隔离性(isolation)。一个事务的执行过程不应受到其他并发事务的干扰。即事务内部的操作及其使用的数据对其他并发事务是隔离的,各并发事务之间互不干扰。
  • 持久性(durability)。持久性也称为永久性(permanence),指事务一旦提交,其对数据库中数据的修改就是永久性的。随后的其他操作或系统故障不应对其产生任何影响。

Python DB API 2.0 的事务接口提供了两个方法:commit 或 rollback。

实例


# SQL删除记录语句
sql = "DELETE FROM EMPLOYEE WHERE AGE > %s" % (20)
try:
   # 执行SQL语句
   cursor.execute(sql)
   # 向数据库提交
   db.commit()
except:
   # 发生错误时回滚
   db.rollback()

对于支持事务的数据库,在 Python 数据库编程中,当游标(cursor)建立之时,便自动开始了一个隐形的数据库事务。

commit() 方法用于提交游标的所有更新操作,rollback() 方法用于回滚当前游标的所有操作。每个方法的调用都会开始一个新的事务。

错误处理

DB API 中定义了一系列数据库操作相关的错误及异常,下表列出了这些错误和异常的具体描述:

异常 描述
Warning 当有严重警告时触发,例如插入数据是被截断等等。必须是 StandardError 的子类。
Error 警告以外所有其他错误类。必须是 StandardError 的子类。
InterfaceError 当有数据库接口模块本身的错误(而不是数据库的错误)发生时触发。 必须是Error的子类。
DatabaseError 和数据库有关的错误发生时触发。 必须是Error的子类。
DataError 当有数据处理时的错误发生时触发,例如:除零错误,数据超范围等等。 必须是DatabaseError的子类。
OperationalError 指非用户控制的,而是操作数据库时发生的错误。例如:连接意外断开、 数据库名未找到、事务处理失败、内存分配错误等等操作数据库是发生的错误。 必须是DatabaseError的子类。
IntegrityError 完整性相关的错误,例如外键检查失败等。必须是DatabaseError子类。
InternalError 数据库的内部错误,例如游标(cursor)失效了、事务同步失败等等。 必须是DatabaseError子类。
ProgrammingError 程序错误,例如数据表(table)没找到或已存在、SQL语句语法错误、 参数数量错误等等。必须是DatabaseError的子类。
NotSupportedError 不支持错误,指使用了数据库不支持的函数或API等。例如在连接对象上 使用.rollback()函数,然而数据库并不支持事务或者事务已关闭。 必须是DatabaseError的子类。

至此,关于 Python3 MySQL 数据库连接的使用示例介绍完毕。如需了解更多 Python3 MySQL 数据库连接相关内容,请搜索本站历史文章或继续浏览以下相关文章。希望大家今后多多支持本站!

相关标签:

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

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 算法库。