当前位置: 首页 > 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.jsqmd.com/news/912295/

相关文章:

  • 华硕笔记本终极控制指南:用G-Helper替代Armoury Crate的完整教程
  • 淘宝淘金币自动化脚本终极指南:快速解决8大常见问题
  • 工装集成墙板十大品牌推荐
  • 如何轻松管理游戏DLSS版本:DLSS Swapper使用指南
  • JavaScript 垃圾回收机制详解
  • 【字节跳动】江苏苏州江南水乡临水低碳液冷算力集群
  • Claude商业分析报告合规性危机预警:GDPR/CCPA/《生成式AI服务管理暂行办法》三重穿透审计清单(含6份可直接套用模板)
  • UE5 蓝图 FPS 02 Event Beginplay
  • 多符号连续 Chirp 调制解调系统(433MHz载波+数据chirp调制解调)V2.0
  • Legacy iOS Kit:技术重构如何让经典iOS设备重获新生?
  • 【案例教程】CASA(Carnegie-Ames-Stanford Approach)模型原理及实践应用
  • AI、区块链与未来媒体:数字时代信任机制的重构与挑战
  • 免费大模型镜像站怎么选?别只看“能用”,稳定、高速、多模型才是关键
  • OPC中国适合大学生吗?一份 AI 实践能力与作品集核验清单
  • 企业考勤系统更新换代,通芝深度解析2025年行业趋势与选型建议
  • 从Excel到Lindy全自动入职:3天完成87%人力事务闭环,中小企速效转型手册
  • 如何免费解锁完整游戏修改体验:WandEnhancer终极指南
  • 终极网盘下载加速指南:九大平台直链解析完整解决方案
  • 星球助手发布更新v1.9.0
  • 如何让经典暗黑破坏神2在现代PC上获得新生:d2dx全面解析
  • 论文降AIGC率神器实测,10款工具对比稳过高校检测
  • 【字节跳动】海南文昌滨海海风潮汐风冷超算枢纽
  • 如何实现跨平台GPU加速:ZLUDA创新兼容层技术深度解析
  • 数字孪生赋能建筑行业 解锁工程全周期智慧管理
  • PCIe-7.3.3 Configuration Request Routing Rules
  • USB3.2 Gen1 对拷线方案 —— 沁恒 CH9339
  • 别再瞎试了!GD32F205 CAN波特率配置,用这个公式和在线工具5分钟搞定
  • 3步搞定加密压缩包密码恢复:ArchivePasswordTestTool专业级解决方案
  • 专业测评!抗爆墙抗疲劳性能排名前五揭晓
  • 2026最新绵阳安县黄金回收+白银回收+铂金回收店铺门店权威榜单TOP1~5家推荐地址电话 - 五金回收