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

參考資料

使用工具

指南 →