我尝试创建批量插入。我使用 gorm github.com/jinzhu/gorm
import (
"fmt"
dB "github.com/edwinlab/api/repositories"
)
func Update() error {
tx := dB.GetWriteDB().Begin()
sqlStr := "INSERT INTO city(code, name) VALUES (?, ?),(?, ?)"
vals := []interface{}{}
vals = append(vals, "XX1", "Jakarta")
vals = append(vals, "XX2", "Bandung")
tx.Exec(sqlStr, vals)
tx.Commit()
return nil
}
但是我得到一个错误:
Error 1136: Column count doesn't match value count at row 1 becuse i return wrong query
INSERT INTO city(code, name) VALUES ('XX1','Jakarta','XX2','Bandung', %!v(MISSING)),(%!v(MISSING), %!v(MISSING))
如果我使用手动查询,它会起作用:
tx.Exec(sqlStr, "XX1", "Jakarta", "XX2", "Bandung")
它将生成:
INSERT INTO city(code, name) VALUES ('XX1', 'Jakarta'),('XX2', 'Bandung')
问题是如何让数组接口(interface)生成像"XX1", "Jakarta", ...
这样的字符串
感谢您的帮助。
最佳答案
如果你想将 slice 的元素传递给带有可变参数的函数,你必须使用 ...
告诉编译器你想单独传递所有元素而不传递 slice 值作为一个参数,所以简单地做:
tx.Exec(sqlStr, vals...)
这在规范中有详细说明:Passing arguments to ... parameters .
Tx.Exec()
有以下人士的签名:
func (tx *Tx) Exec(query string, args ...interface{}) (Result, error)
所以你必须通过 vals...
。也不要忘记检查返回的错误,例如:
res, err := tx.Exec(sqlStr, vals...)
if err != nil {
// handle error
}
关于mysql - Golang 加入数组接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36128444/