亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何將參數傳遞給 db.exec

如何將參數傳遞給 db.exec

Go
米琪卡哇伊 2021-08-23 16:51:51
考慮 db.Exec 語句,db.Exec("插入 $1 值($2,$3,to_timestamp($4),var1,var2,var3,var4)^^ 但是如果我想做類似的事情db.Exec("INSERT INTO table_name_$1 值($2,$3,to_timestamp($4),var1,var2,var3,var4)它不起作用,$1 被附加到表名而不是 $1 的值,如何將它添加到查詢中?
查看完整描述

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...)


查看完整回答
反對 回復 2021-08-23
  • 1 回答
  • 0 關注
  • 256 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號