为了账号安全,请及时绑定邮箱和手机立即绑定

如何将参数传递给 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 关注
  • 226 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信