来源引用网络知识与某站曹老师视频相互结合学习记录,仅供参考!
使用PyMySQL模块技术操作MySQL数据库
一、 PyMySql 简介
在数据开发过程中,对于数据量巨大且具有复杂关系的数据,一般推荐使用数据库进行保存;PyMySQL 是纯 Python 实现的 MySQL 客户端第三方库,它提供了一个简洁且功能强大的接口用于连接和操作 MySQL 数据库,完全兼容 MySQL 协议;在 Python 开发中,操作 MySQL 数据库是最常见的需求之一,是 Python 开发操作 MySQL 的首选工具,通过使用 PyMySql 模块技术操作 MySQL 数据库;
学习参考:MySQL Python 连接与使用、Python3 MySQL 数据库连接 - PyMySQL 驱动
可借鉴:使用 Python 语言 从 0 到 1 搭建完整 Web UI自动化测试学习系列 35--二次封装MySQL数据库连接操作
二、安装
使用 python 第三方模块,安装第三方库;
命令行安装;
pip install PyMySQL
PyCharm 工具→软件包安装;


三、实现
烦请自行准备一个可连接的数据库,用于测试开发,例如:自行安装在本地的数据库服务 ,某开源项目的数据库 ,以及分享文章 UI 自动化测试、API 接口自动化测试服务项目数据库,或者其他可远程连接的数据等(建议可直接使用本地已安装的数据库服务);
可参考:数据库学习MySQL系列2、Windows11系统安装MySQL方法一.msi安装详细教程、
数据库学习MySQL系列4、工具一 Navicat Premium 图形化软件的使用详细教程、
虚拟机详细图文教程系列15、Linux虚拟机CentOS8系统部署禅道开源项目
以禅道开源项目为例:
- 启动所部署项目的虚拟机服务器;
- 开启禅道项目服务;
- 测试连接;


PyMySQL 创建数据库连接
通过PyMySQL 的 Connection 类创建数据库连接,用完一定要关闭连接;需掌握以下核心概念。
- Connection(连接对象):建立 Python 与 MySQL 服务器的连接,管理会话、事务。
- Cursor(游标对象):执行 SQL 语句、获取查询结果的核心工具。
- 事务:MySQL 默认支持事务,增删改操作需手动提交 / 回滚。
- 关闭资源 :操作完成后必须关闭游标 + 关闭连接,避免资源泄漏。
1、 使用 PyCharm 工具打开或创建任意项目文件(项目名自定义,例如:pythonProjectlearn),在项目根目录下新建一个目录文件(目录名自定义即可,例如:PyMySQLDB),再继续新建一个文件名为dbsql 的 Python 文件(自定义名称,注意文件名不能和导入的模块名"PyMySQL"一样);
2、在新建的 Python 文件中输入以下代码,尝试书写一个最基本的完整的数据库连接(一般均是推荐使用数据库配置文件,后续只需要修改对应的数据库信息即可);
python
# pymysql创建数据库连接 最基础写法
# 导包,从pymysql模块引入Connection成员类
from pymysql import Connection
# 通过Connection类方法构造,最后返回给创建对象conn,创建数据库连接
conn = Connection(
host='192.168.88.133', # 主机名,IP地址;本地可填写 localhost
port=3306, # 端口
user='root', # MySQL用户名
passwd='qwer123' # MySQL密码
)
print(f"创建数据库连接之后的类型为: {type(conn)}")
print(f"获取 MySQL 数据库主机信息: {conn.get_host_info()}")
print(f"获取版本信息,成功则返回MySQL服务器的版本号,失败则返回false: {conn.get_server_info()}")
# 关闭连接
conn.close()
# 运行结果
创建数据库连接之后的类型为: <class 'pymysql.connections.Connection'>
获取 MySQL 数据库主机信息: socket 192.168.88.133:3306
获取版本信息,成功则返回MySQL服务器的版本号,失败则返回false: 5.5.5-10.7.6-MariaDB
3、添加异常处理,修改 dbsql.py 文件内容;
python
# pymysql创建数据库连接 最基础写法
# 导包,从pymysql模块引入Connection成员类
from pymysql import Connection
# 定义全局变量,使作用域生效
conn = None
try:
# 通过Connection类方法构造,最后返回给创建对象conn,创建数据库连接
conn = Connection(
host='192.168.88.133', # 主机名,IP地址;本地可填写 localhost
port=3306, # 端口
user='root', # MySQL用户名
passwd='qwer123' # MySQL密码
)
print(f"创建数据库连接之后的类型为: {type(conn)}")
print(f"获取 MySQL 数据库主机信息: {conn.get_host_info()}")
print(f"获取版本信息,成功则返回MySQL服务器的版本号,失败则返回false: {conn.get_server_info()}")
except Exception as e:
print(f'异常:{e}')
finally:
# 判断conn是否存在
if conn:
# 关闭连接
conn.close()
PyMySQL 执行 DDL 语句
连接 MySQL 数据库后,可以使用 cursor() 方法创建一个游标对象;游标对象用于执行 MySQL 语句并返回结果。
游标是一个数据库对象,用于逐行检索查询结果;在处理大量数据时,游标允许逐行或按块检索数据,从而避免一次性加载所有数据;这种方法有助于减少内存消耗并提高性能;作为数据库交互的核心,游标使开发者能够方便地执行 SQL 操作、从结果集中提取数据、管理事务,并确保资源的合理使用。
- 与数据库的交互: 游标提供了与数据库交互的接口,允许执行不同类型的 SQL 语句(如查询、插入、更新、删除等)。它像一个指针,指向数据库结果集的当前位置,帮助我们从数据库中获取数据或执行修改。
- 执行 SQL 语句: 通过游标的
execute()方法,我们可以执行 SELECT 数据查询语句以及INSERT、UPDATE、DELETE 等数据操作语句。 - 获取查询结果: 执行完查询后,游标提供了
fetchall()方法获取所有结果;该方法返回一个包含所有结果行的列表,每一行是一个元组。 - 迭代遍历结果集: 游标返回的结果集可以方便地进行迭代遍历;例如,可以在循环中逐行处理数据;这样可以逐条访问查询结果,而不必一次性加载所有数据,从而节省内存并提高效率。
- 管理数据库事务: 事务可确保一系列数据库操作要么全部成功,要么全部失败,保持数据的一致性;游标用于执行这些操作并利用连接对象的
commit()和rollback()方法管理事务的提交或回滚。
4、 新建一个名称为"student_db"的数据库,执行 DDL 建表语句;
CREATE TABLE t_student (
id int(11) NOT NULL AUTO_INCREMENT,
name varchar(255) NOT NULL,
age int(11) NOT NULL,
PRIMARY KEY(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
这里在建表语句里面没有指定数据库,所以需要选择数据库;
python
# 导包,从pymysql模块引入Connection成员类
from pymysql import Connection
# 定义全局变量,使作用域生效
conn = None
try:
# 通过Connection类方法构造,最后返回给创建对象conn,创建数据库连接
conn = Connection(
host='192.168.88.133', # 主机名,IP地址;本地可填写 localhost
port=3306, # 端口
user='root', # MySQL用户名
passwd='qwer123' # MySQL密码
)
# 通过 .cursor()方法创建游标对象,返回的就是游标对象(自定义变量名称)
cursor = conn.cursor()
# 定义一个建表sql语句,创建t_student学生表(id、姓名、年龄)
sql = """
CREATE TABLE t_student (
id int(11) NOT NULL AUTO_INCREMENT,
name varchar(255) NOT NULL,
age int(11) NOT NULL,
PRIMARY KEY(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
"""
# 选择要操作的数据库--可自行新建一个名称为 student_db 的数据库
conn.select_db("student_db")
# 使用游标对象,来执行sql
cursor.execute(sql)
except Exception as e:
print(f'异常:{e}')
finally:
# 判断conn是否存在
if conn:
# 关闭连接
conn.close()
print("测试数据创建完成!")
可先执行创建数据库,再指定需要操作的数据名(若数据库名、表名已存在,烦请自行更改);
python
# # pymysql创建数据库连接 最基础写法
# 导包,从pymysql模块引入Connection成员类
from pymysql import Connection
# 定义全局变量,使作用域生效
conn = None
try:
# 通过Connection类方法构造,最后返回给创建对象conn,创建数据库连接
conn = Connection(
host='192.168.88.133', # 主机名,IP地址;本地可填写 localhost
port=3306, # 端口
user='root', # MySQL用户名
passwd='qwer123' # MySQL密码
)
# 通过 .cursor()方法创建游标对象,返回的就是游标对象(自定义变量名称)
cursor = conn.cursor()
# 创建数据库
cursor.execute("CREATE DATABASE IF NOT EXISTS student_db DEFAULT CHARACTER SET utf8mb4")
# 定义一个建表sql语句,创建t_student学生表(id、姓名、年龄)
sql = """
CREATE TABLE student_db.t_student (
id int(11) NOT NULL AUTO_INCREMENT,
name varchar(255) NOT NULL,
age int(11) NOT NULL,
PRIMARY KEY(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
"""
# 选择要操作的数据库--上述sql语句中已指定数据库名
# conn.select_db("student_db")
# 使用游标对象,来执行sql
cursor.execute(sql)
# 关闭游标对象--可以省略
# cursor.close()
except Exception as e:
print(f'异常:{e}')
finally:
# 判断conn是否存在
if conn:
# 关闭连接
conn.close()
print("测试数据创建完成!")
自行刷新数据库查看;
这里游标对象亦是需要关闭的,但是在实际开发过程中不用关闭,因为到最后关闭连接时,游标对象亦会自动关闭,所以可以省略;

5、配置数据库连接信息;
在开发过程中基本上都是操作同一个数据库,亦有可能会操作其他的数据库;可以在数据库连接时去指定某个数据库;
python
# 导包,从pymysql模块引入Connection成员类
from pymysql import Connection
# 定义全局变量,使作用域生效
conn = None
try:
# 通过Connection类方法构造,最后返回给创建对象conn,创建数据库连接
conn = Connection(
host='192.168.88.133', # 主机名,IP地址;本地可填写 localhost
port=3306, # 端口
user='root', # MySQL用户名
passwd='qwer123', # MySQL密码
database='student_db', # 指定操作的数据库
charset='utf8' # 指定字符集
)
# 通过 .cursor()方法创建游标对象,返回的就是游标对象(自定义变量名称)
cursor = conn.cursor()
# 创建数据库
# cursor.execute("CREATE DATABASE IF NOT EXISTS student_db DEFAULT CHARACTER SET utf8mb4")
# 定义一个建表sql语句,创建t_student学生表(id、姓名、年龄)
sql = """
CREATE TABLE student (
id int(11) NOT NULL AUTO_INCREMENT,
name varchar(255) NOT NULL,
age int(11) NOT NULL,
PRIMARY KEY(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
"""
# 选择要操作的数据库--上述sql语句中已指定数据库名
# conn.select_db("student_db")
# 使用游标对象,来执行sql
cursor.execute(sql)
# 关闭游标对象--可以省略
# cursor.close()
except Exception as e:
print(f'异常:{e}')
finally:
# 判断conn是否存在
if conn:
# 关闭连接
conn.close()
print("测试数据创建完成!")

6、 向 student_db 数据库 student 表中添加测试数据;
python
# 导包,从pymysql模块引入Connection成员类
from pymysql import Connection
# 定义全局变量,使作用域生效
conn = None
try:
# 通过Connection类方法构造,最后返回给创建对象conn,创建数据库连接
conn = Connection(
host='192.168.88.133', # 主机名,IP地址;本地可填写 localhost
port=3306, # 端口
user='root', # MySQL用户名
passwd='qwer123', # MySQL密码
database='student_db', # 指定操作的数据库
charset='utf8' # 指定字符集
)
# 通过 .cursor()方法创建游标对象,返回的就是游标对象(自定义变量名称)
cursor = conn.cursor()
# 创建数据库
# cursor.execute("CREATE DATABASE IF NOT EXISTS student_db DEFAULT CHARACTER SET utf8mb4")
# 定义一个建表sql语句,创建t_student学生表(id、姓名、年龄)
# sql = """
# CREATE TABLE student2 (
# id int(11) NOT NULL AUTO_INCREMENT,
# name varchar(255) NOT NULL,
# age int(11) NOT NULL,
# PRIMARY KEY(id)
# ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
# """
# 选择要操作的数据库--上述sql语句中已指定数据库名
# conn.select_db("student_db")
# 使用游标对象,来执行sql
# cursor.execute(sql)
# 插入测试数据
students = [
("赵一", 1),
("钱二", 2),
("孙三", 3),
("李四", 4),
("周五", 5),
("吴六", 6),
("郑七", 7),
("王八", 8),
("冯九", 9),
("陈十", 10),
]
# 批量插入数据,指定数据库名、数据库表名
sql_insert = "INSERT INTO student_db.student(name,age) VALUES(%s,%s)"
# executemany()方法用于执行多条SQL语句
# 批量插入使用 executemany() 方法,该方法的第二个参数是一个元组列表
cursor.executemany(sql_insert, students)
# 插入必须提交,数据表内容有更新,必须使用到该语句
conn.commit()
# 关闭游标对象--可以省略
# cursor.close()
except Exception as e:
print(f'异常:{e}')
finally:
# 判断conn是否存在
if conn:
# 关闭连接
conn.close()
print("测试数据创建完成!")

7、或者再新建一个表插入测试数据(注意数据库表名);
python
# 导包,从pymysql模块引入Connection成员类
from pymysql import Connection
# 定义全局变量,使作用域生效
conn = None
try:
# 通过Connection类方法构造,最后返回给创建对象conn,创建数据库连接
conn = Connection(
host='192.168.88.133', # 主机名,IP地址;本地可填写 localhost
port=3306, # 端口
user='root', # MySQL用户名
passwd='qwer123', # MySQL密码
database='student_db', # 指定操作的数据库
charset='utf8' # 指定字符集
)
# 通过 .cursor()方法创建游标对象,返回的就是游标对象(自定义变量名称)
cursor = conn.cursor()
# 创建数据库
# cursor.execute("CREATE DATABASE IF NOT EXISTS student_db DEFAULT CHARACTER SET utf8mb4")
# 定义一个建表sql语句,创建t_student学生表(id、姓名、年龄)
sql = """
CREATE TABLE student2 (
id int(11) NOT NULL AUTO_INCREMENT,
name varchar(255) NOT NULL,
age int(11) NOT NULL,
PRIMARY KEY(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
"""
# 选择要操作的数据库--上述sql语句中已指定数据库名
# conn.select_db("student_db")
# 使用游标对象,来执行sql
cursor.execute(sql)
# 插入测试数据
students = [
("褚十一", 11),
("卫十二", 12),
("蒋十三", 13),
("沈十四", 14),
("韩十五", 15),
("杨十六", 16),
("朱十七", 17),
("秦十八", 18),
("尤十九", 19),
("许廿", 20),
]
# 批量插入数据,指定数据库名、数据库表名
sql_insert = "INSERT INTO student_db.student2(name,age) VALUES(%s,%s)"
# executemany()方法用于执行多条SQL语句
# 批量插入使用 executemany() 方法,该方法的第二个参数是一个元组列表
cursor.executemany(sql_insert, students)
# 插入必须提交,数据表内容有更新,必须使用到该语句
conn.commit()
# 关闭游标对象--可以省略
# cursor.close()
except Exception as e:
print(f'异常:{e}')
finally:
# 判断conn是否存在
if conn:
# 关闭连接
conn.close()
print("测试数据创建完成!")

其他操作(烦请自行测试验证);
对表中的字段进行增,删,改的操作
alter table 表名 add/drop/modify/change [column]......
向表中添加字段:alter table 表名 add [column] 字段名 字段类型;
ALTER TABLE t_student ADD COLUMN sex VARCHAR(2)
删除表中的字段:alter table 表名 drop [column] 字段名;
ALTER TABLE t_student DROP sex;
修改字段的名字:alter table 表名 change [column] 旧字段名 新字段名 字段类型;
ALTER TABLE t_student CHANGE COLUMN name new_name2 VARCHAR(20);
修改字段的类型:alter table 表名 modify [column] 字段名 字段类型;
ALTER TABLE t_student MODIFY id VARCHAR(20);
修改表的名字:alter table 旧表名 rename to 新表名;
ALTER TABLE t_student RENAME TO t_student2;
常用 select 查询语句
-
fetchone() -- 取1 条结果, 一次拿一条数据;
-
fetchmany(n) -- 取 n 条结果,接着上面数据继续往下取n条(元组形式);
-
fetchall() -- 取全部结果,取剩下的所有数据(元组形式);
取1 条结果, 一次拿一条数据;
fetchone()
取 n 条结果,接着上面数据继续往下取n条(元组形式);
fetchmany(n)
#取全部结果,取剩下的所有数据(元组形式)
fetchall()
python
# 导包,从pymysql模块引入Connection成员类
from pymysql import Connection
# 定义全局变量,使作用域生效
conn = None
try:
# 通过Connection类方法构造,最后返回给创建对象conn,创建数据库连接
conn = Connection(
host='192.168.88.133', # 主机名,IP地址;本地可填写 localhost
port=3306, # 端口
user='root', # MySQL用户名
passwd='qwer123', # MySQL密码
database='student_db', # 指定操作的数据库
charset='utf8' # 指定字符集
)
# 通过 .cursor()方法创建游标对象,返回的就是游标对象(自定义变量名称)
cursor = conn.cursor()
# sql语句--自行定义
sql = 'select * from student'
# 使用游标对象,来执行sql
cursor.execute(sql)
# 获取查询所有结果
result = cursor.fetchall()
print(f"类型:{type(result)},共有%d条数据,内容:{result}" % len(result))
# 迭代遍历结果集
for row in result:
print(row)
except Exception as e:
print(f'异常:{e}')
finally:
# 判断conn是否存在
if conn:
# 关闭连接
conn.close()
PyMySQL 执行 DML 语句
PyMySQL 数据库模块可以使用游标的 execute() 方法执行 DML(数据操作语言,英文全称为 Data Manipulation Language) 的 insert、update、delete 语句,对数据库进行插入、修改和删除数据操作。
DDL (Data Definition Language) ,是数据定义语言 。顾名思义,它用来定义和管理数据库的结构,包括创建表(CREATE TABLE)、修改表结构(ALTER TABLE)、删除表(DROP TABLE)、创建索引(CREATE INDEX)等等。DDL操作会影响数据库的元数据,比如创建了一个新表,数据库系统就会记录下这个表的结构信息。它通常由数据库管理员或开发人员在设计和维护数据库结构时使用,而不是应用程序运行时频繁调用。
insert 插入数据操作

python
# 导包,从pymysql模块引入Connection成员类
from pymysql import Connection
# 定义全局变量,使作用域生效
conn = None
try:
# 通过Connection类方法构造,最后返回给创建对象conn,创建数据库连接
conn = Connection(
host='192.168.88.133', # 主机名,IP地址;本地可填写 localhost
port=3306, # 端口
user='root', # MySQL用户名
passwd='qwer123', # MySQL密码
database='student_db', # 指定操作的数据库
charset='utf8' # 指定字符集
)
# 通过 .cursor()方法创建游标对象,返回的就是游标对象(自定义变量名称)
cursor = conn.cursor()
# sql语句--使用 %s 占位符,防止 SQL 注入)
sql = 'insert into t_student(name, age) values (%s,%s)'
# 插入测试数据信息
datas = ('赵大', '18')
try:
# 使用游标对象,来执行sql
cursor.execute(sql, datas)
# 确认提交
conn.commit()
print(f"插入成功,新id:{cursor.lastrowid}")
except:
# 插入失败则回滚
conn.rollback()
print("插入失败")
except Exception as e:
print(f'异常:{e}')
finally:
# 判断conn是否存在
if conn:
# 关闭连接
conn.close()

设置自动提交
设置数据库配置项 autocommit=True 自动提交后可不用再使用 commit() 方法确认提交;
lastrowid 方法将输出新插入行的ID,如果是连续插入多行数据,lastrowid 方法将总是返回最后一次插入操作的行的ID;需要注意的是,lastrowid 的值并不总是在所有情况下都有意义或可用;比如,在某些数据库配置或表结构中,可能没有自增主键,或者数据库可能不支持这一功能;因此,在使用 lastrowid 时,最好做好错误处理和检查。
若未设置自动提交,选择手动使用 commit() 方法确认提交时,这时主键 insert_id() 方法需要写在 commit() 方法之前,**若在 commit 后,insert_id() 就得不到了,只能返回0;**比较隐晦的 PyMySQL 包的版本(目前 PyMySQL 为 v1.1.1 版本)差异缺陷,或可升级版本解决此类问题。
python
# 导包,从pymysql模块引入Connection成员类
from pymysql import Connection
# 定义全局变量,使作用域生效
conn = None
try:
# 通过Connection类方法构造,最后返回给创建对象conn,创建数据库连接
conn = Connection(
host='192.168.88.133', # 主机名,IP地址;本地可填写 localhost
port=3306, # 端口
user='root', # MySQL用户名
passwd='qwer123', # MySQL密码
database='student_db', # 指定操作的数据库
charset='utf8', # 指定字符集
autocommit=True # 设置自动提交
)
# 通过 .cursor()方法创建游标对象,返回的就是游标对象(自定义变量名称)
cursor = conn.cursor()
# sql语句--使用 %s 占位符,防止 SQL 注入)
sql = 'insert into t_student(name, age) values (%s,%s)'
# 插入测试数据信息
datas = ('钱二', '20')
try:
# 使用游标对象,来执行sql
cursor.execute(sql, datas)
# 确认提交--设置autocommit=True 自动提交后可不用再确认提交
# conn.commit()
print(f"插入成功,新id:{cursor.lastrowid},主键id={conn.insert_id()}")
except:
# 插入失败则回滚
conn.rollback()
print("插入失败")
except Exception as e:
print(f'异常:{e}')
finally:
# 判断conn是否存在
if conn:
# 关闭连接
conn.close()
update 更新数据操作
更新操作时建议加上条件判断,否则会全表更新;
python
# 导包,从pymysql模块引入Connection成员类
from pymysql import Connection
# 定义全局变量,使作用域生效
conn = None
try:
# 通过Connection类方法构造,最后返回给创建对象conn,创建数据库连接
conn = Connection(
host='192.168.88.133', # 主机名,IP地址;本地可填写 localhost
port=3306, # 端口
user='root', # MySQL用户名
passwd='qwer123', # MySQL密码
database='student_db', # 指定操作的数据库
charset='utf8', # 指定字符集
autocommit=True # 设置自动提交
)
# 通过 .cursor()方法创建游标对象,返回的就是游标对象(自定义变量名称)
cursor = conn.cursor()
# sql语句--使用 %s 占位符,防止 SQL 注入)--更新语句,建议使用where条件,否则更新整个表
sql = 'UPDATE student SET age=%s WHERE id=%s'
# 测试数据信息
datas = ('99', '1')
try:
# 使用游标对象,来执行sql
cursor.execute(sql, datas)
print("更新成功")
except:
# 更新失败则回滚
conn.rollback()
print("插入失败")
except Exception as e:
print(f'异常:{e}')
finally:
# 判断conn是否存在
if conn:
# 关闭连接
conn.close()
delete 删除数据操作
删除数据操作亦建议加上条件判断,否则会删除整个表;
python
# 导包,从pymysql模块引入Connection成员类
from pymysql import Connection
# 定义全局变量,使作用域生效
conn = None
try:
# 通过Connection类方法构造,最后返回给创建对象conn,创建数据库连接
conn = Connection(
host='192.168.88.133', # 主机名,IP地址;本地可填写 localhost
port=3306, # 端口
user='root', # MySQL用户名
passwd='qwer123', # MySQL密码
database='student_db', # 指定操作的数据库
charset='utf8', # 指定字符集
autocommit=True # 设置自动提交
)
# 通过 .cursor()方法创建游标对象,返回的就是游标对象(自定义变量名称)
cursor = conn.cursor()
# sql语句--使用 %s 占位符,防止 SQL 注入)--删除语句
sql = 'DELETE FROM student2 WHERE id=%s'
# 测试数据信息--元组格式
datas = (10,)
try:
# 使用游标对象,来执行sql
cursor.execute(sql, datas)
print("删除成功")
except:
# 删除失败则回滚
conn.rollback()
print("删除失败")
except Exception as e:
print(f'异常:{e}')
finally:
# 判断conn是否存在
if conn:
# 关闭连接
conn.close()
PyMySQL 调用存储过程
先创建一个简单的存储过程;
DELIMITER //
CREATE PROCEDURE test_add(m INT,n INT, OUT result INT)
BEGIN
SET result=m+n;
END; //

测试验证;
DELIMITER //
CREATE PROCEDURE test_add(m INT,n INT, OUT result INT)
BEGIN
SET result=m+n;
END; //
SET @s=0;
CALL test_add(1,2,@s);
SELECT @s

使用存储过程通过 pymysql 模块来调用;
python
# 导包,从pymysql模块引入Connection成员类
from pymysql import Connection
# 定义全局变量,使作用域生效
conn = None
try:
# 通过Connection类方法构造,最后返回给创建对象conn,创建数据库连接
conn = Connection(
host='192.168.88.133', # 主机名,IP地址;本地可填写 localhost
port=3306, # 端口
user='root', # MySQL用户名
passwd='qwer123', # MySQL密码
database='student_db', # 指定操作的数据库
charset='utf8', # 指定字符集
autocommit=True # 设置自动提交
)
# 通过 .cursor()方法创建游标对象,返回的就是游标对象(自定义变量名称)
cursor = conn.cursor()
# 使用游标对象,调用存储过程
cursor.execute('CALL test_add(1,2,@s);')
# 再来一个执行
cursor.execute('select @s;')
# 获取结果--这里只有一个值,使用的是fetchone()
result = cursor.fetchone()
# 打印查看结果--元组格式
print(result[0])
except Exception as e:
print(f'异常:{e}')
finally:
# 判断conn是否存在
if conn:
# 关闭连接
conn.close()
其他
DML (Data Manipulation Language) ,正如我们上面详述的,是数据操作语言 。它的核心是操作数据本身,包括数据的增(INSERT)、删(DELETE)、改(UPDATE)。它处理的是表里"填了什么内容",比如"给张三的工资加500块"、"删除李四的订单"。DML是应用程序与数据库进行日常交互的主要方式,是数据活力的体现。
DDL (Data Definition Language) ,是数据定义语言 。顾名思义,它用来定义和管理数据库的结构,包括创建表(CREATE TABLE)、修改表结构(ALTER TABLE)、删除表(DROP TABLE)、创建索引(CREATE INDEX)等等。DDL操作会影响数据库的元数据,比如创建了一个新表,数据库系统就会记录下这个表的结构信息。它通常由数据库管理员或开发人员在设计和维护数据库结构时使用,而不是应用程序运行时频繁调用。
DCL (Data Control Language) ,是数据控制语言 。它主要用于管理数据库的权限和访问控制。比如,授予某个用户对特定表的查询权限(GRANT SELECT ON table_name TO user;),或者撤销某个用户的更新权限(REVOKE UPDATE ON table_name FROM user;)。DCL确保了数据的安全性和完整性,决定了谁能做什么、不能做什么。这就像是给数据库的各个房间分配钥匙和权限,确保只有授权的人才能进入或操作。
所以,可以这样理解:DDL是盖房子(定义结构),DML是装修房子和住进去生活(操作数据),DCL是管理房子的门禁和钥匙(控制权限)。这三者共同构成了数据库管理的完整体系,各司其职,缺一不可。
拓展(仅供参考)
connect timeout:建立数据库连接超时
socket timeout:socket读取超时
statement timeout:单个sql执行超时
transaction timeout:事务执行超时,一个事务中可能包含多个sql
get connection timeout:从连接池中获取链接超时
未完待续......