gpt4 book ai didi

mysql - 使用 slice 执行 sql 准备语句

转载 作者:IT王子 更新时间:2023-10-29 01:26:47 24 4
gpt4 key购买 nike

我写了一个函数(当然是在 Go 中),通过 thismap[string]interface{} 插入到 mysql图书馆。

下面代码的解释:

  1. 函数接收名为 tablestring 和名为 datamap[string]interface{}。<
  2. 我将数据分成键(称为的变量)和值(称为的变量)。
  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() 命令无法接收这样的 slice (Array):stmt.Exec(values),只有像这样的值:stmt.Exec(values[0], values[1], values[2]...)

问题:

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

代码:

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
}
}
}

编辑:我已经编辑了上面的函数,它现在可以正常工作了。

谢谢!

最佳答案

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

......
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...)

关于mysql - 使用 slice 执行 sql 准备语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24353646/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com