【发布时间】:2014-06-23 17:27:57
【问题描述】:
我编写了一个函数(当然是在 Go 中),通过 this 库将 map[string]interface{} 插入 mysql。
以下代码说明:
- 函数接收称为table的
string和称为data的map[string]interface{}。 - 我将
data分隔为键(称为列 的变量)和值(称为值 的变量)。 - 我从名为 column_text 的 columns 变量生成,看起来像这样:
first_name, last_name, birth_day, date_added - 我从名为 variable_text 的 values 变量生成,看起来像这样:
?, ?, ?, ? - 我打开mysql连接:
db, err := sql.Open("mysql", "user:pass@/database") - 我创建准备好的语句:
stmt, err := db.Prepare("INSERT INTO " + table + " ( " + columns_text + " ) VALUES ( " + values_text + " )") - 我执行了准备语句。但我有一个问题。列数和值一直在变化,
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
}
}
}
编辑:我已经编辑了上面的函数,现在可以完美运行了。
谢谢!
【问题讨论】: