Golang准备了#34; CREATE TABLE"

时间:2016-10-17 01:28:53

标签: postgresql go prepared-statement create-table

我发现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

编辑: 显然我知道我可以像平常一样构建字符串,但是想知道是否有内置方式。

2 个答案:

答案 0 :(得分:6)

在PostgreSQL中不可能,因为:

  1. PostgreSQL的绑定参数只能用于文字,而不能用于标识符。这是因为解析器必须知道标识符是什么才能正确解析查询,但绑定参数仅在解析后发送。所以你不能使用表名等参数。

  2. 无论如何,PostgreSQL不支持实用程序语句中的绑定参数(插入/更新/删除/选择以外的任何内容)。

  3. 某些驱动程序支持客户端参数替换,并通过不同的放置参数语法转义标识符,但据我所知,Go不支持。因此,您必须仔细使用字符串插值。请记住始终将标识符括在"double quotes"中,并将所有嵌入的引号加倍,因此SQL中的表名my "table"!变为"my ""table!"

答案 1 :(得分:1)

您不能在SQL中使用表名或列名的参数。您必须手动转义变量部分并在代码中构建表名,并在将其发送到数据库之前将其注入SQL字符串中。

同样,PostgreSQL engine is built的方式是它不允许在CREATE语句中的任何位置使用变量。这意味着运行此类查询时引擎不会接受任何参数。