当前位置: 首页 > news >正文

测试开发干货:用 Python 玩转数据库,告别 pymysql 的繁琐操作!

好久不见,我是ai橙好测开,专注 AI 测试开发与性能测试~

在做接口自动化、性能测试或者日常数据校验时,数据库操作是绕不开的一环。相信很多同学和我一样,最开始接触 Python 操作数据库时,用的都是pymysql这类库。

每次都要写connectcursorexecutecommitclose,还要处理异常、写try...finally,代码又长又容易出错,尤其是查询结果还要手动转成字典,简直太麻烦了!

今天给大家安利一个超级好用的第三方库 ——records,让你用几行代码优雅地搞定数据库操作,再也不用写那些冗余代码了!


一、records 是什么?

records是一个基于 SQLAlchemy 封装的轻量级 Python 数据库操作库,被称为 “人类的数据库库”。它的设计目标就是让数据库操作变得简单、直观、优雅,支持几乎所有主流数据库(MySQL、PostgreSQL、SQLite 等),特别适合测试开发场景下的快速数据校验、接口造数和测试数据清理。

它的核心优势:

  • 代码极度简洁,不用手动管理连接和游标
  • 查询结果直接支持字典、列表、JSON、Pandas DataFrame 等多种格式
  • 自动处理事务和连接关闭,告别资源泄漏
  • 支持参数化查询,避免 SQL 注入风险

二、安装与基础使用

1. 安装

直接用 pip 安装即可:

bash

运行

pip install records # 如果操作 MySQL,还需要安装 pymysql pip install pymysql

2. 连接数据库

一行代码就能连接数据库,不用写一堆配置:

python

运行

import records # 连接 MySQL 数据库,格式:数据库类型://用户:密码@主机:端口/库名 db = records.Database('mysql+pymysql://root:123456@localhost:3306/test_db')

3. 常用操作示例

(1)查询数据(SELECT)

最常用的查询,直接用query()方法,结果可以直接迭代:

python

运行

# 查询用户表中所有数据 users = db.query("SELECT * FROM user WHERE age > :age", age=18) # 方式1:直接遍历结果,每一行都是字典格式 for user in users: print(f"用户名:{user.name}, 年龄:{user.age}, 手机号:{user.phone}") # 方式2:直接转成列表字典 user_list = users.all(as_dict=True) print(user_list) # 方式3:直接转成 Pandas DataFrame(做数据校验超方便) df = users.all(as_df=True) print(df.head()) # 方式4:获取单条数据 user = users.first() print(user.name)

这里用到了参数化查询:age,可以避免 SQL 注入,比手动拼接字符串安全多了!

(2)插入数据(INSERT)

插入数据也超级简单,支持参数化批量插入:

python

运行

# 单条插入 db.query(""" INSERT INTO user (name, age, phone) VALUES (:name, :age, :phone) """, name="张三", age=20, phone="13800138000") # 批量插入(适合接口自动化造测试数据) data = [ {"name": "李四", "age": 22, "phone": "13800138001"}, {"name": "王五", "age": 25, "phone": "13800138002"}, {"name": "赵六", "age": 19, "phone": "13800138003"} ] db.bulk_query(""" INSERT INTO user (name, age, phone) VALUES (:name, :age, :phone) """, data)
(3)更新和删除(UPDATE/DELETE)

和查询、插入的用法完全一致:

python

运行

# 更新数据 db.query(""" UPDATE user SET age = :new_age WHERE name = :name """, new_age=21, name="张三") # 删除数据 db.query("DELETE FROM user WHERE name = :name", name="赵六")
(4)事务操作

如果需要批量操作要么全成功要么全失败,直接用事务上下文管理器:

python

运行

with db.transaction() as tx: tx.query("INSERT INTO user (name, age) VALUES (:name, :age)", name="事务用户1", age=30) tx.query("INSERT INTO user (name, age) VALUES (:name, :age)", name="事务用户2", age=31) # 如果中间出错,会自动回滚,不会插入任何数据

三、为什么测试开发一定要试试它?

  1. 减少重复代码:不用每次都写连接、游标、关闭连接的模板代码,把精力放在业务逻辑上
  2. 降低出错概率:自动管理连接和事务,避免忘记关闭连接导致的资源泄漏,参数化查询避免 SQL 注入
  3. 结果处理更灵活:查询结果可以直接转成字典、列表、DataFrame,做接口自动化校验、性能测试数据对比时特别方便
  4. 学习成本极低:只要会写 SQL,就能直接上手,不用花时间学习复杂的 ORM 框架

四、一个完整的测试场景示例

比如我们要做一个用户注册接口的自动化测试,需要先造数据、调用接口,再校验数据库中的结果:

python

运行

import records import requests # 1. 连接数据库 db = records.Database('mysql+pymysql://root:123456@localhost:3306/test_db') # 2. 准备测试数据 test_user = {"name": "测试用户", "age": 20, "phone": "13900139000"} # 3. 调用注册接口 response = requests.post("http://localhost:8080/api/register", json=test_user) assert response.status_code == 200, "接口调用失败" # 4. 校验数据库中的数据是否正确 result = db.query("SELECT * FROM user WHERE phone = :phone", phone=test_user["phone"]).first() assert result is not None, "用户未插入数据库" assert result.name == test_user["name"], "用户名不一致" assert result.age == test_user["age"], "年龄不一致" print("测试用例执行通过!")

整个过程简洁明了,没有冗余的数据库操作代码,一眼就能看懂业务逻辑。


五、总结

records虽然功能不如 SQLAlchemy 强大,但在测试开发场景下,它的简洁和高效是无可替代的。无论是接口自动化造数、数据校验,还是性能测试前的数据准备、测试后的数据清理,它都能帮你节省大量时间。

如果你还在写冗长的 pymysql 代码,不妨试试 records,相信你会打开新世界的大门!

后续我还会分享更多 Python 测试开发、性能测试相关的干货,比如 locust 压测、抽象类在测试框架中的应用,欢迎大家关注、点赞、收藏,一起交流学习~

http://www.gsyq.cn/news/1423605.html

相关文章:

  • 华硕笔记本终极控制指南:用G-Helper替代Armoury Crate的完整教程
  • 多符号连续 Chirp 调制解调系统(433MHz载波+数据chirp调制解调)V2.0
  • Claude商业分析报告合规性危机预警:GDPR/CCPA/《生成式AI服务管理暂行办法》三重穿透审计清单(含6份可直接套用模板)
  • 星球助手发布更新v1.9.0
  • OPC中国适合大学生吗?一份 AI 实践能力与作品集核验清单
  • 3步搞定加密压缩包密码恢复:ArchivePasswordTestTool专业级解决方案
  • USB3.2 Gen1 对拷线方案 —— 沁恒 CH9339
  • 2026最新绵阳安县黄金回收+白银回收+铂金回收店铺门店权威榜单TOP1~5家推荐地址电话 - 五金回收
  • 如何高效批量下载抖音无水印视频:douyin-downloader终极指南
  • 2026最新绵阳北川黄金回收+白银回收+铂金回收店铺门店权威榜单TOP1~5家推荐地址电话 - 五金回收
  • ArchivePasswordTestTool实战指南:5分钟找回遗忘的压缩包密码
  • 【字节跳动】贵州贵阳高山溶洞恒温天然冷源超算中心
  • 2026最新临沂沂南黄金回收+白银回收+铂金回收店铺门店权威榜单TOP1~5家推荐地址电话 - 五金回收
  • API管理平台选型策略:聚焦五大平台深度评估
  • 如何彻底解决Paradox游戏模组冲突:IronyModManager终极指南
  • 2026最新甘孜康定黄金回收+白银回收+铂金回收店铺门店权威榜单TOP1~5家推荐地址电话 - 金诚回收
  • 我做了一个 AI Agent 状态核心灯:ESP32 + OLED + WS2812 + 3D打印
  • 【字节跳动】天津滨海临港海上风电液冷智算超级枢纽
  • 2026最新黄冈麻城黄金回收+白银回收+铂金回收店铺门店权威榜单TOP1~5家推荐地址电话 - 金诚回收
  • Perseus深度解析:如何通过无偏移地址技术解锁碧蓝航线全皮肤功能
  • python-py转pyd加密
  • 抖音下载神器:5分钟掌握批量下载去水印完整指南
  • 终极免费解锁:Wand-Enhancer让WeMod专业版功能触手可及
  • 技术揭秘:Linux环境下BitLocker加密分区的透明访问方案
  • 2026最新邯郸邱县黄金回收+白银回收+铂金回收店铺门店权威榜单TOP1~5家推荐地址电话 - 金诚回收
  • 2026最新安康宁陕黄金回收+白银回收+铂金回收店铺门店权威榜单TOP1~5家推荐地址电话 - 检测回收中心
  • Spring Bean 作用域、线程安全与生命周期
  • 本体论 vs 语义层:两种 AI 业务语义底座的区别、场景与建设路径
  • 2026最新抚州资溪黄金回收+白银回收+铂金回收店铺门店权威榜单TOP1~5家推荐地址电话 - 金诚回收
  • 【LeetCode刷题日记】669.修剪二叉搜索树