SheepDev

SQL与测试数据

更换 SQL 占位符时如何保持参数顺序?

使用工具

换库后 SQL 不再报错却查错记录,可能是参数顺序变了。从 :user 换到 $1 要同时检查 SQL 和传值。用小例子查看转换及映射;工具不执行查询。

先检查两个值的顺序

待转换 SQL
SELECT * FROM orders WHERE owner = :user AND state = :state;
命名参数
{"user":"demo","state":"open"}

选择 named 输入、postgresql 输出并填 JSON。SQL 出现顺序使 :user 为 $1、:state 为 $2,并非 JSON 键顺序。检查 arguments:$1 对 demo,$2 对 open。

目标只是编号占位符,不是整段方言迁移。日期函数、类型及标识符规则不自动转换,应另行检查。

同名出现两次要两个值吗?

两列查同一用户
SELECT * FROM tasks WHERE owner = :user OR reviewer = :user;

参数为 {"user":"demo"} 时编号输出两处都是 $1;问号输出则需 demo、demo 两个位置。相同问号仍代表不同出现位置。

parameters 是每次出现的映射,arguments 是目标传值。应区分出现次数与不同身份数,并确认复用名称本身不是错误。

不替换字符串和注释

不是参数的符号
SELECT ':user' AS note FROM tasks WHERE owner = :user; -- :user

只转换 WHERE 中的符号;引号内是数据,末尾是注释。盲目替换会误改两者,应同时检查保留部分。

工具不理解所有 SQL 扩展,特殊引用、运算符与转换需另查。PostgreSQL 问号可能是运算符,因此拒绝该方言的 question 输入;勿只为消错改方言。

同时检查多余和缺失参数

SQL 只用 :user 却还传 state,可能沿用旧配置。缺失和多余键均报错;位置参数用 JSON 数组核对数量。别随意补空值,应找出哪侧过时。

最后检查驱动的传值约定

转换成功不代表驱动接受目标格式。查其 SQL 与参数接口,在隔离测试数据中验证记录;保持参数绑定,不拼接值,也不用秘密数据。

参考资料

使用工具

指南 →