由于 gorm v1 不支持批量插入,于是升级为 gorm v2,原本以为就简单的吧 Create 改为 CreateInBatches 就可以了。但是一直 panic。
大概能猜到是因为传入的数据是接口型的slice导致的,但是一直不知道该怎么改,网上搜了好久也没搜到相关的答案,最后在官方 issue 中看到了一个类似的问题(#3685),对应修改了下,终于可以了。
还是自己太菜了。。。
type I interface {
TableName() string
}
type A struct {
Data string `gorm:"column:data"`
}
func (A) TableName() string {
return "tb_A"
}
func main() {
dsn := "host=localhost user=postgres password= dbname=example port=5432 sslmode=disable"
db, err := gorm.Open(postgres.Open(dsn), &gorm.Config{})
if err != nil {
log.Fatal("failed to connect database")
}
if err := db.AutoMigrate(&A{}); err != nil {
log.Fatal(err)
}
datas := []I{
&A{"123"}, &A{"456"},
}
insert(db, datas)
}
func insert(db *gorm.DB, data []I) {
t := reflect.TypeOf(data[0])
insertList := reflect.New(reflect.SliceOf(t)).Elem()
for _, elem := range data {
insertList = reflect.Append(insertList, reflect.ValueOf(elem))
}
if err := db.Table("tb_A").CreateInBatches(insertList.Interface(), 2).Error; err != nil {
log.Fatal(err)
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)