【问题标题】:Golang prepared statements for "CREATE TABLE"Golang 为“CREATE TABLE”准备了语句
【发布时间】:2017-02-25 21:37:13
【问题描述】:

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

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

【问题讨论】:

    标签: postgresql go prepared-statement create-table


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      这在 PostgreSQL 中是不可能的,因为:

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

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

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

      【讨论】:

        相关资源