Gorm: 是否有批量创建的方法

Created on 15 Jan 2018  ·  5Comments  ·  Source: go-gorm/gorm

我们有个功能需要做数据库导入导出,是否可以支持批量创建,这样速度可以比较快

All 5 comments

插入太慢是否因为这个库使用了反射造成的?

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 注入问题

Was this page helpful?
0 / 5 - 0 ratings

Related issues

leebrooks0 picture leebrooks0  ·  3Comments

corvinusy picture corvinusy  ·  3Comments

littletwolee picture littletwolee  ·  3Comments

bramp picture bramp  ·  3Comments

Ganitzsh picture Ganitzsh  ·  3Comments