测试开发干货:用 Python 玩转数据库,告别 pymysql 的繁琐操作!
好久不见我是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(mysqlpymysql://root:123456localhost:3306/test_db)3. 常用操作示例1查询数据SELECT最常用的查询直接用query()方法结果可以直接迭代python运行# 查询用户表中所有数据 users db.query(SELECT * FROM user WHERE age :age, age18) # 方式1直接遍历结果每一行都是字典格式 for user in users: print(f用户名{user.name}, 年龄{user.age}, 手机号{user.phone}) # 方式2直接转成列表字典 user_list users.all(as_dictTrue) print(user_list) # 方式3直接转成 Pandas DataFrame做数据校验超方便 df users.all(as_dfTrue) 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张三, age20, phone13800138000) # 批量插入适合接口自动化造测试数据 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_age21, 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, age30) tx.query(INSERT INTO user (name, age) VALUES (:name, :age), name事务用户2, age31) # 如果中间出错会自动回滚不会插入任何数据三、为什么测试开发一定要试试它减少重复代码不用每次都写连接、游标、关闭连接的模板代码把精力放在业务逻辑上降低出错概率自动管理连接和事务避免忘记关闭连接导致的资源泄漏参数化查询避免 SQL 注入结果处理更灵活查询结果可以直接转成字典、列表、DataFrame做接口自动化校验、性能测试数据对比时特别方便学习成本极低只要会写 SQL就能直接上手不用花时间学习复杂的 ORM 框架四、一个完整的测试场景示例比如我们要做一个用户注册接口的自动化测试需要先造数据、调用接口再校验数据库中的结果python运行import records import requests # 1. 连接数据库 db records.Database(mysqlpymysql://root:123456localhost:3306/test_db) # 2. 准备测试数据 test_user {name: 测试用户, age: 20, phone: 13900139000} # 3. 调用注册接口 response requests.post(http://localhost:8080/api/register, jsontest_user) assert response.status_code 200, 接口调用失败 # 4. 校验数据库中的数据是否正确 result db.query(SELECT * FROM user WHERE phone :phone, phonetest_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 压测、抽象类在测试框架中的应用欢迎大家关注、点赞、收藏一起交流学习