mysql – 用slice执行sql prepared语句
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了mysql – 用slice执行sql prepared语句,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2370字,纯文字阅读大概需要4分钟。
内容图文
我写了一个函数(当然是In),它通过this库将map [string] interface {}插入mysql.
下面的代码说明:
>函数接收名为table的字符串和map [string] interface {},称为data.
>我将数据分为键(变量称为列)和值(变量称为值).
>我从columns变量中生成一个名为column_text的变量,它看起来像这样: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(值[0],值[1],值[2] ……)
问题:
我来自PHP,其中PDO :: Statement在执行时可以接收数组.
如何用slice(Array)执行语句? (如果我可以用不同的库来做,请写出库的名称以及如何使用它,谢谢!)
代码:
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 …接口{},所以对于你的具体例子,你需要改变两件事:
......
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 prepared语句全部内容,希望文章能够帮你解决mysql – 用slice执行sql prepared语句所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。