SQL与测试数据
更换 SQL 占位符时如何保持参数顺序?
使用工具
换库后 SQL 不再报错却查错记录,可能是参数顺序变了。从 :user 换到 $1 要同时检查 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 与参数接口,在隔离测试数据中验证记录;保持参数绑定,不拼接值,也不用秘密数据。