【问题标题】:Execute sql prepared statement with slice使用切片执行 sql 准备语句
【发布时间】:2014-06-23 17:27:57
【问题描述】:

我编写了一个函数(当然是在 Go 中),通过 this 库将 map[string]interface{} 插入 mysql。

以下代码说明:

  1. 函数接收称为tablestring和称为datamap[string]interface{}
  2. 我将data 分隔为键(称为 的变量)和值(称为 的变量)。
  3. 我从名为 column_textcolumns 变量生成,看起来像这样:first_name, last_name, birth_day, date_added
  4. 我从名为 variable_textvalues 变量生成,看起来像这样:?, ?, ?, ?
  5. 我打开mysql连接:db, err := sql.Open("mysql", "user:pass@/database")
  6. 我创建准备好的语句:stmt, err := db.Prepare("INSERT INTO " + table + " ( " + columns_text + " ) VALUES ( " + values_text + " )")
  7. 我执行了准备语句。但我有一个问题。列数和值一直在变化,stmt.Exec() 命令无法接收像这样的切片(数组):stmt.Exec(values),只有像这样的值:stmt.Exec(values[0], values[1], values[2]...)

问题:

我来自 PHP,其中 PDO::Statement 在执行时可以接收一个数组。 如何使用切片(数组)执行语句? (如果我可以使用不同的库,请写下库的名称和使用方法,谢谢!)

代码:

func insertToDB(table string, data map[string]interface{}) {
columns := make([]interface{}, 0, len(data))
values := make([]interface{}, 0, len(data))

for  key, _ := range data {
   columns = append(columns, key)
   values = append(values, data[key])
}

columns_text := ""
i := 0
of := len(data)

for i < of {
    column := columns[i].(string)

    if i == 0 {
        columns_text = column
    } else {
        columns_text = columns_text + ", " + column
    }

    i++
}

fmt.Println(columns_text + " = " + table)

values_text := ""

i = 0

for i < of {

    if i == 0 {
        values_text = "?"
    } else {
        values_text = values_text + ", ?"
    }

    i++
}

fmt.Println(values_text)
fmt.Println(values)
fmt.Println(data)

db, err := sql.Open("mysql", "root:root@/bacafe")
if err != nil {
    return -1, err
}
defer db.Close()

stmtIns, err := db.Prepare("INSERT INTO " + table + " ( " + columns_text + " ) VALUES ( " +  values_text + " )")
if err != nil {
    return -1, err
}
defer stmtIns.Close() // Close the statement when we leave main() / the program terminates

result, err := stmtIns.Exec(values...)
if err != nil {
    return -1, err
} else {
    insertedID, err := result.LastInsertId()
    if err != nil {
        return -1, err
    } else {
        return int(insertedID), nil
    }
}
}

编辑:我已经编辑了上面的函数,现在可以完美运行了。

谢谢!

【问题讨论】:

    标签: mysql sql go


    【解决方案1】:

    您在正确的轨道上,但是 Stmt.Exec 采用 args ...interface{},因此对于您的具体示例,您需要更改 2 件事:

    ......
    values := make([]interface{}, 0, len(data))
    ......
    //adding ... expands the values, think of it like func.apply(this, array-of-values) in 
    // javascript, in a way.
    _, err = stmtIns.Exec(values...) 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-18
      • 1970-01-01
      • 2020-11-13
      • 2015-02-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多