使用PyMySQL模块技术操作MySQL数据库

来源引用网络知识与某站曹老师视频相互结合学习记录,仅供参考!

使用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:从连接池中获取链接超时

未完待续......

相关推荐
卷无止境1 小时前
终端里的AI辅助,一场正在发生的编程效率变革
后端·python
苏灿烤鱼1 小时前
上下文写成文件系统,为什么向量还能静默丢?
python·github·agent
SamChan902 小时前
对比 4 种主流 PDF 文档解析方案:PyMuPDF vs pdfplumber vs Apache PDFBox vs 大模型 OCR
python·ai·pdf·ocr·apache·机器翻译
zmzmzmalo4 小时前
Linux ELF文件加载与内存管理揭秘
linux·网络·数据库
安_10 小时前
如何构建和使用向量索引?HNSW 和 IVF 有什么区别?
python·ai
Super 含11 小时前
Android 启动优化(五):线程、GC 与 IO 为什么会拖慢启动?
java·服务器·数据库
counting money11 小时前
Java IO流详解:从InputStream到文件操作实战
java·开发语言·python
ltl12 小时前
向量检索引擎选型:决策树、RAG 回链与开放问题
数据库
坚持学习前端日记12 小时前
Python SQLAlchemy ORM 从0到1精通实战手册(基础到复杂高阶)
数据库·python·oracle