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 关注
- 226 浏览
添加回答
举报