如何将参数传递给 db.exec

考虑 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 的值,如何将它添加到查询中?


米琪卡哇伊
浏览 227回答 1
1回答

呼啦一阵风

既然你说第一个例子有效,一个解决方案是将完整的表名作为参数传递,预先进行字符串连接: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 existLINE 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...)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go