在Golang中动态创建PostgreSQL表

时间:2017-12-14 08:53:08

标签: sql postgresql go

我正在使用" database / sql"包中GO。我想创建一个变量名表。

我能想到的只有 -

db.Exec(`CREATE TABLE`+table_name+`;`)

但由于可以进行SQL注入,因此不安全。

4 个答案:

答案 0 :(得分:1)

我不在GO中编码,但这可能对注射安全:

tx.Prepare(`do $$ begin execute format($f$create table %I()$f$,$1); end; $$;`)

然后

stmt.Exec(table_name)

答案 1 :(得分:1)

只需使用占位符:

db.Exec("CREATE TABLE $1", "table_name")

wikipedia:

  

对于大多数开发平台,可以使用与参数一起使用的参数化语句(有时称为占位符或绑定变量),而不是在语句中嵌入用户输入。占位符只能存储给定类型的值,而不能存储任意SQL片段。因此,SQL注入将被简单地视为一个奇怪的(可能是无效的)参数值。

答案 2 :(得分:0)

就像@Vao Tsun说的那样:

stmt, err := db.Prepare("CREATE TABLE $1")
if err != nil {
    log.Fatal(err)
}
defer stmt.Close()

result, err := stmt.Exec("DB_NAME_HERE")

浏览原始documentation并查看他们的示例,以便清楚了解。

答案 3 :(得分:0)

我们可以使用 QuoteIdentifier

db.Exec(fmt.Sprintf("CREATE TABLE %s", pq.QuoteIdentifier(table)))

这是文档中的几行 -

QuoteIdentifier quotes an "identifier" (e.g. a table or a column name) to be
used as part of an SQL statement.  
For example:

    tblname := "my_table"
    data := "my_data"
    quoted := pq.QuoteIdentifier(tblname)
    err := db.Exec(fmt.Sprintf("INSERT INTO %s VALUES ($1)", quoted), data)

Any double quotes in name will be escaped. 
The quoted identifier will be case sensitive when used in a query.  
If the input string contains a zero byte, the result will be truncated immediately before it.