1 回答

TA貢獻1802條經驗 獲得超6個贊
既然你說第一個例子有效,一個解決方案是將完整的表名作為參數傳遞,預先進行字符串連接:
db.Exec("INSERT INTO $1 values($2,$3)", "table_name_"+tbl, "this", "that")
您還可以按照注釋中的建議,使用fmt.Sprintf和手動格式化字符串%s。
準備好的報表
我有點驚訝你的第一個例子有效,因為這在 Postgres 中不是有效的語法。如果使用表名作為參數創建一個準備好的語句,它會返回一個語法錯誤:
# PREPARE fooplan (text, bool, numeric) AS
INSERT INTO $1 VALUES($2, $3);
ERROR: syntax error at or near "$1"
LINE 2: INSERT INTO $1 VALUES($2, $3);
而您提供的第二個示例也附加$1到表的名稱,因此庫的行為正確:
# PREPARE fooplan (text, bool, numeric) AS
INSERT INTO table_name_$1 VALUES($2, $3);
ERROR: relation "table_name_$1" does not exist
LINE 2: INSERT INTO table_name_$1 VALUES($2, $3);
所以在你的第一個例子中,圖書館可能對你有利,但這可能不是你應該過分依賴的東西。
最安全的長期解決方案可能是使用fmt.Sprintf,并進行必要的轉義,格式化表名,然后在Exec調用中使用它:
sql := fmt.Sprintf(`INSERT INTO table_name_%s values($1,$2,to_timestamp($3))`, tbl)
db.Exec(sql, params...)
- 1 回答
- 0 關注
- 256 瀏覽
添加回答
舉報