使用DatabaseLibrary库更新数据库数据未生效,正确操作方式是什么?
问题根源
你的更新逻辑本身没有语法错误,运行不报错是因为SQL语句本身合法,但DatabaseLibrary默认不会自动提交DML(数据操纵语言,对应增删改操作)的事务,未提交的改动只会存在于当前会话中,不会持久化到数据库,因此你核验时看不到变更。
修正后的代码
*** Settings *** Library DatabaseLibrary *** Variables *** ${DB_NAME} xxxxxxxx ${DB_USER_NAME} xxxxxxxx ${DB_USER_PASSWORD} xxxxxxxx ${DB_HOST} xxxxxxxx ${DB_PORT} xxxxxxxx ${OLD_EMAIL} 123456@email.com ${NEW_EMAIL} email123@email.com *** Test Cases *** Update Email Connect To Database psycopg2 ${DB_NAME} ... ${DB_USER_NAME} ... ${DB_USER_PASSWORD} ... ${DB_HOST} ... ${DB_PORT} # 可选:先确认匹配的记录数是否符合预期 ${match_count} Execute Sql String SELECT count(*) FROM user_contact WHERE contact = '${OLD_EMAIL}' Log 匹配到的待更新记录数:${match_count} # 执行更新 Execute Sql String UPDATE user_contact SET contact = '${NEW_EMAIL}' WHERE contact = '${OLD_EMAIL}' # 核心缺失步骤:提交事务 Commit # 可选:执行查询核验更新结果 ${new_count} Execute Sql String SELECT count(*) FROM user_contact WHERE contact = '${NEW_EMAIL}' Log 更新后匹配新邮箱的记录数:${new_count} # 关闭数据库连接 Disconnect From Database
其他排查要点
- 确认WHERE条件的旧邮箱确实存在于目标表中,避免条件无匹配导致更新行数为0
- 确认脚本连接的数据库实例、库名、表名,和你核验的目标完全一致,避免跨环境/跨库的校验误差
- 如果更新后需要临时验证不保留改动,可以把
Commit替换为Rollback回滚事务
可选实现方案
- 开启连接自动提交:部分数据库驱动支持连接时传入autoCommit参数,无需手动执行Commit,以psycopg2为例可在连接时额外添加参数:
Connect To Database psycopg2 ${DB_NAME} ${DB_USER_NAME} ${DB_USER_PASSWORD} ${DB_HOST} ${DB_PORT} autocommit=True - 批量更新:如果需要修改多条邮箱记录,可以把新旧邮箱对存入列表,循环执行更新语句后统一提交,减少事务提交次数
- 预编译SQL防注入:如果邮箱值是动态传入的变量,建议使用
Execute Sql关键字的参数化传参方式,避免SQL注入风险,示例:Execute Sql UPDATE user_contact SET contact = %s WHERE contact = %s ${NEW_EMAIL} ${OLD_EMAIL}
内容的提问来源于stack exchange,提问作者Joseferson
相关产品推荐
相关产品推荐

