Golang 为 "CREATE TABLE" 准备了语句

Golang prepared statements for "CREATE TABLE"

我发现 create table 语句无法识别我要插入的通配符。我如何在 golang 中使用准备好的语句来做一些事情?

                    stmt, err := tx.Prepare(`
                    CREATE TABLE table_number_ (
                            guid character varying(64) NOT NULL,
                            number integer,
                            name character varying(64),
                            PRIMARY KEY (guid),
                            CONSTRAINT some_onstraint
                            CHECK ((number = ))
                    )`)
                    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

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

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

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

在 Postgre 中不可能SQL 因为:

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

  2. PostgreSQL 无论如何都不支持实用程序语句中的绑定参数(insert/update/delete/select 以外的任何东西)。

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