我发现create table
语句无法识别我要插入的通配符。我怎样才能在golang中做一个准备好的语句?
stmt, err := tx.Prepare(`
CREATE TABLE table_number_$1 (
guid character varying(64) NOT NULL,
number integer,
name character varying(64),
PRIMARY KEY (guid),
CONSTRAINT some_onstraint
CHECK ((number = $2))
)`)
if err != nil {
return err
}
defer stmt.Close()
if _, err := stmt.Exec(
string(table_number),
table_number; err != nil {
tx.Rollback()
return err
}
我打印出来的错误是:
sql: expected 0 arguments, got 2
编辑: 显然我知道我可以像平常一样构建字符串,但是想知道是否有内置方式。
答案 0 :(得分:6)
在PostgreSQL中不可能,因为:
PostgreSQL的绑定参数只能用于文字,而不能用于标识符。这是因为解析器必须知道标识符是什么才能正确解析查询,但绑定参数仅在解析后发送。所以你不能使用表名等参数。
无论如何,PostgreSQL不支持实用程序语句中的绑定参数(插入/更新/删除/选择以外的任何内容)。
某些驱动程序支持客户端参数替换,并通过不同的放置参数语法转义标识符,但据我所知,Go不支持。因此,您必须仔细使用字符串插值。请记住始终将标识符括在"double quotes"
中,并将所有嵌入的引号加倍,因此SQL中的表名my "table"!
变为"my ""table!"
。
答案 1 :(得分:1)
您不能在SQL中使用表名或列名的参数。您必须手动转义变量部分并在代码中构建表名,并在将其发送到数据库之前将其注入SQL字符串中。
同样,PostgreSQL engine is built的方式是它不允许在CREATE
语句中的任何位置使用变量。这意味着运行此类查询时引擎不会接受任何参数。