好久不见,我是ai橙好测开,专注 AI 测试开发与性能测试~
在做接口自动化、性能测试或者日常数据校验时,数据库操作是绕不开的一环。相信很多同学和我一样,最开始接触 Python 操作数据库时,用的都是pymysql这类库。
每次都要写connect、cursor、execute、commit、close,还要处理异常、写try...finally,代码又长又容易出错,尤其是查询结果还要手动转成字典,简直太麻烦了!
今天给大家安利一个超级好用的第三方库 ——records,让你用几行代码优雅地搞定数据库操作,再也不用写那些冗余代码了!
一、records 是什么?
records是一个基于 SQLAlchemy 封装的轻量级 Python 数据库操作库,被称为 “人类的数据库库”。它的设计目标就是让数据库操作变得简单、直观、优雅,支持几乎所有主流数据库(MySQL、PostgreSQL、SQLite 等),特别适合测试开发场景下的快速数据校验、接口造数和测试数据清理。
它的核心优势:
- 代码极度简洁,不用手动管理连接和游标
- 查询结果直接支持字典、列表、JSON、Pandas DataFrame 等多种格式
- 自动处理事务和连接关闭,告别资源泄漏
- 支持参数化查询,避免 SQL 注入风险
二、安装与基础使用
1. 安装
直接用 pip 安装即可:
bash
运行
pip install records # 如果操作 MySQL,还需要安装 pymysql pip install pymysql2. 连接数据库
一行代码就能连接数据库,不用写一堆配置:
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) # 如果中间出错,会自动回滚,不会插入任何数据三、为什么测试开发一定要试试它?
- 减少重复代码:不用每次都写连接、游标、关闭连接的模板代码,把精力放在业务逻辑上
- 降低出错概率:自动管理连接和事务,避免忘记关闭连接导致的资源泄漏,参数化查询避免 SQL 注入
- 结果处理更灵活:查询结果可以直接转成字典、列表、DataFrame,做接口自动化校验、性能测试数据对比时特别方便
- 学习成本极低:只要会写 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 压测、抽象类在测试框架中的应用,欢迎大家关注、点赞、收藏,一起交流学习~