【发布时间】:2022-01-19 19:01:03
【问题描述】:
我知道一次插入多个数据效率更高:
INSERT INTO test(n1, n2, n3)
VALUES(v1, v2, v3),(v4, v5, v6),(v7, v8, v9);
如何在 golang 中做到这一点?
data := []map[string]string{
{"v1":"1", "v2":"1", "v3":"1"},
{"v1":"2", "v2":"2", "v3":"2"},
{"v1":"3", "v2":"3", "v3":"3"},
}
//I do not want to do it
for _, v := range data {
sqlStr := "INSERT INTO test(n1, n2, n3) VALUES(?, ?, ?)"
stmt, _ := db.Prepare(sqlStr)
res, _ := stmt.Exec(v["v1"], v["v2"], v["v3"])
}
使用字符串拼接,但不好。 db.Prepare 更安全吧?
sqlStr := "INSERT INTO test(n1, n2, n3) VALUES"
for k, v := range data {
if k == 0 {
sqlStr += fmt.Sprintf("(%v, %v, %v)", v["v1"], v["v2"], v["v3"])
} else {
sqlStr += fmt.Sprintf(",(%v, %v, %v)", v["v1"], v["v2"], v["v3"])
}
}
res, _ := db.Exec(sqlStr)
我需要一个更安全高效的函数一次插入多个数据。
【问题讨论】:
-
我不确定 MySQL 是否支持这一点,但一些 SQL 实现支持将数组作为参数传递给查询。如果 MySQL 支持它,并且您使用的任何数据库驱动程序也支持它,您可以执行
db.Exec("INSERT INTO test (n1, n2, n3) VALUES ?, ?, ?", []int{1, 2, 3}, []int{4, 5, 6}, []int{7, 8, 9})之类的操作。如果您希望能够处理任意数量的插入,您仍然必须手动构造查询字符串(也就是说,您必须构造一个带有“?”的查询,一遍又一遍地重复),但它比什么都没有。
标签: go