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 與參數介面,在隔離測試資料中驗證紀錄;保持參數綁定,不串接值,也不用秘密資料。