我们有个功能需要做数据库导入导出,是否可以支持批量创建,这样速度可以比较快
插入太慢是否因为这个库使用了反射造成的?
Don't have this feature right now, you could use another library for those cases. like https://github.com/theplant/batchputs
批量插入操作应该是基本的要求啊,支持起来也不麻烦啊。为啥不支持呢?
提供一个批量插入的 code:
func BulkInsertPids(db *gorm.DB, posts []*Post) error {
fieldNums := 6
quesMarkString := "("
for i := 0; i < fieldNums; i++ {
quesMarkString += "?, "
}
quesMarkString = quesMarkString[: len(quesMarkString) - 2] + ")"
valueStrings := make([]string, 0, len(posts))
valueArgs := make([]interface{}, 0, len(posts) * fieldNums)
for _, post := range posts {
valueStrings = append(valueStrings, quesMarkString)
valueArgs = append(valueArgs, post.Id)
valueArgs = append(valueArgs, post.Name)
valueArgs = append(valueArgs, post.Cid)
valueArgs = append(valueArgs, post.CreatedTime)
valueArgs = append(valueArgs, post.X)
valueArgs = append(valueArgs, post.Y)
}
stmt := fmt.Sprintf("INSERT INTO pid (id, name, cid, created_time, x, y) VALUES %s", strings.Join(valueStrings, ","))
err := db.Exec(stmt, valueArgs...).Error
return err
}
提供一个批量插入的 code:
func BulkInsertPids(db *gorm.DB, posts []*Post) error { fieldNums := 6 quesMarkString := "(" for i := 0; i < fieldNums; i++ { quesMarkString += "?, " } quesMarkString = quesMarkString[: len(quesMarkString) - 2] + ")" valueStrings := make([]string, 0, len(posts)) valueArgs := make([]interface{}, 0, len(posts) * fieldNums) for _, post := range posts { valueStrings = append(valueStrings, quesMarkString) valueArgs = append(valueArgs, post.Id) valueArgs = append(valueArgs, post.Name) valueArgs = append(valueArgs, post.Cid) valueArgs = append(valueArgs, post.CreatedTime) valueArgs = append(valueArgs, post.X) valueArgs = append(valueArgs, post.Y) } stmt := fmt.Sprintf("INSERT INTO pid (id, name, cid, created_time, x, y) VALUES %s", strings.Join(valueStrings, ",")) err := db.Exec(stmt, valueArgs...).Error return err }
sql 注入问题