我尝试创建批量插入。我使用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
}
但我收到了一个错误:
错误1136:列计数与第1行的值计数不匹配,因为我返回了错误的查询
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')
问题是如何使数组接口生成像"XX1", "Jakarta", ...
感谢您的帮助。
答案 0 :(得分:5)
如果要将切片的元素传递给具有variadic参数的函数,则必须使用if($scope.test == null || $scope.test == undefined || $scope.test == "" || $scope.test.lenght == 0){
console.log("test is not defined");
}
else{
console.log("test is defined ",$scope.test);
}
告诉编译器要单独传递所有元素,而不是将切片值作为单个参数传递,所以简单地做:
...
详见规范:Passing arguments to ... parameters。
Tx.Exec()
的签名为:
tx.Exec(sqlStr, vals...)
所以你必须通过func (tx *Tx) Exec(query string, args ...interface{}) (Result, error)
。另外不要忘记检查返回的错误,例如:
vals...