iT邦幫忙

0

請教gorm 如何使用FindInBatches?

  • 分享至 

  • xImage

官方提供的範例為

// batch size 100
result := db.Where("processed = ?", false).FindInBatches(&results, 100, func(tx *gorm.DB, batch int) error {
  for _, result := range results {
    // batch processing found records
  }

  tx.Save(&results)

  tx.RowsAffected // number of records in this batch

  batch // Batch 1, 2, 3

  // returns error will stop future batches
  return nil
})

result.Error // returned error
result.RowsAffected // processed records count in all batches

我的程式如下

type error interface {
	Error() string
}
// Ssldomainlist [...]
type Ssldomainlist struct {
	Domain string `gorm:"primary_key;column:domain;type:varchar(80);not null" json:"Domain"`
	TaxID  string `gorm:"column:taxID;type:varchar(8);not null" json:"tax_id"`
	Status int    `gorm:"column:status;type:int;not null" json:"status"`
}

func main() {
	dsn := "user:password@tcp(127.0.0.1:3306)/db?charset=utf8mb4&parseTime=True&loc=Local"
	db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
	if err != nil {
		fmt.Println("連線失敗")
	}
	sqlDB, err := db.DB()
	if err != nil {
		fmt.Println("取得DB失敗")
	}
	sqlDB.SetMaxIdleConns(10)
	sqlDB.SetMaxOpenConns(150)
	sqlDB.SetConnMaxLifetime(time.Hour)
	// batch size 100
	var Ssldomainlist []Ssldomainlist
	count := 0
	result := db.Where("status = ?", 1).FindInBatches(&Ssldomainlist, 100, batchProcesser(db, count))

}
func batchProcesser(tx *gorm.DB, batch int) error {
	return nil
}

錯誤顯示為cannot use batchProcesser(db, count) (type error) as type func(*gorm.DB, int) error in argument to db.Where("status = ?", 1).FindInBatches
請問有人可以給予意見嗎?


後來實證官方src有問題,已經遞交PR

把你的寫法放出來才知道你哪裡有問題
netlabfox iT邦新手 5 級 ‧ 2020-11-10 14:24:45 檢舉
附上了~
你不能在 func 內帶參數
我認為他會自動帶參數
把前面的 db.Where("status = ?", 1) 跟 limit 帶進去
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

0
海綿寶寶
iT邦大神 1 級 ‧ 2020-11-10 10:46:20

1.先執行官方範例(不做任何修改),確定可以正常執行
2.修改官方範例成你要的程式,只要修改一列
3.如果沒錯就繼續改第二列
4.如果錯了就知道是錯在第n列

netlabfox iT邦新手 5 級 ‧ 2020-11-10 14:25:21 檢舉

直接複製貼上就有錯了,所以不知道是不是前置作業有其他問題

我要發表回答

立即登入回答