go - 如何使用Golang快速向Postgres添加很多行

标签 go

我每天从API返回8000行,并且必须将这些结果保存在数据库中。
一对一地做这很疯狂,这需要很长时间。因此,我决定尝试执行go例程,以发现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.XyzFlow

for _, 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:反射:调用reflect.Value.Interface零值
goroutine 35 [运行中]:

最佳答案

引用GORM中的事务将对您有所帮助。
https://gorm.io/docs/transactions.html#A-Specific-Example
如果您在事务内处理并提交多个查询,我认为不会有任何重大的性能负担。

关于go - 如何使用Golang快速向Postgres添加很多行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64599963/

相关文章:

authentication - Golang HTTP 基本认证

google-app-engine - 谷歌去 : routing request handling mystical declarations?

batch-file - 在下一个批处理脚本运行中使用由批处理脚本设置的环境变量

go - 如何在 map[string]string 中读取 *redis.Client.TxPipeline.Exec() 方法的响应

go - 无法生成覆盖

python - 楼层划分

GO:为什么从客户端正在监听的地址拨号不起作用,而相反的地址呢?

golang变量设置

go - 在 wg.wait() 完成后停止请求输入的选项

Go/goland 无法读取存储库