为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用 Golang 快速向 Postgres 添加大量行

如何使用 Golang 快速向 Postgres 添加大量行

Go
繁花如伊 2022-07-11 15:39:46
我每天从 API 返回 8000 行,我必须将这些结果保存在我的数据库中。一个接一个地做这件事很疯狂,需要很长时间。因此,我决定尝试一下 goroutines,以发现在 8000 行中只有 1000 行(正负)实际被插入。wg := sync.WaitGroup{}wg.Add(len(xyz.Hours))for _, e := range xyz.Hours {    go createDatabaseEntry(e, &wg)}使用 Go 例程,它非常快,但只会插入大约 1000 行,其余的将因任何原因而留空。有人能告诉我将它存储到我的 Postgress 数据库的合适方法是什么吗?我正在使用 GORM 作为数据库库。当我使用下面的代码 (createDatabaseEntry fn) 时,需要 5 分钟以上才能完成。for _, e := range xyz.Hours {    msInt, _ := strconv.ParseInt(strconv.Itoa(e.Timestamp), 10, 64)    t := time.Unix(0, msInt*int64(time.Millisecond))    ef := models.Xyz{        Timestamp: t,        Unit:      e.Unit,        Value:     e.Value,    }    db.Create(&ef)}让它变慢的不是前两行(strconv),我删除了它们,但将行添加到 Postgres 仍然非常慢。我也尝试进行批量插入,但后来我从 Gorm 得到一长串错误,我不明白为什么。var test []models.XyzFlowfor _, e := range xyz.Hours {    msInt, _ := strconv.ParseInt(strconv.Itoa(e.Timestamp), 10, 64)    t := time.Unix(0, msInt*int64(time.Millisecond))    test = append(test, models.XyzFlow{        Timestamp: t,        Unit:      e.Unit,        Value:     e.Value,    })}db.Create(&test)2020/10/29 23:47:39 http: 恐慌服务 [::1]:52886: 反映:在零值 goroutine 35 [运行] 上调用 reflect.Value.Interface:
查看完整描述

1 回答

?
繁华开满天机

TA贡献1816条经验 获得超4个赞

参考 GORM 中的事务会对您有所帮助。

https://gorm.io/docs/transactions.html#A-Specific-Example

如果您在事务中处理并提交多个查询,我认为不会有任何显着的性能负载。


查看完整回答
反对 回复 2022-07-11
  • 1 回答
  • 0 关注
  • 257 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号