2 回答

TA贡献1780条经验 获得超5个赞
我想自己回答这个问题,作为一个开发人员,我的第一个本能是查看堆栈溢出并将其传达给人们
我相信sqlx中的批量upsert是最近在1.3.0中引入的。它在README中有详细说明,但作为一个ORM,它是一堆PR已经转发并还原了更改以支持多种SQL风格。
识别查询是否是批量查询的当前正则表达式期望查询以空格或括号结尾,基本上是占位符。
请在此处查看提交。
为了解决这个问题,我能够使用内部函数和一些旁路来使postgres提供的批量upsert工作。
这是相同的代码。为方便起见,请在此处重新注册:
sliceOfStructs := []model.Gamer{
{
UserID: "123",
Name: "aarengee",
Address: "xd",
Eligible: true,
},
{
UserID: "1234",
Name: "aarengeeAgain",
Address: "xd",
Eligible: false,
},
}
upsertQuery := "INSERT INTO gamer_details (user_id, name, address, eligible,updated_at) VALUES (:user_id,:name,:address,:eligible,now())"
onConflictStatement := " ON CONFLICT (user_id, name) DO UPDATE SET address = excluded.address,eligible = excluded.eligible, updated_at = now() RETURNING *"
query, queryArgs, _ := db.BindNamed(upsertQuery, sliceOfStructs)
query = db.Rebind(query)
query = query + onConflictStatement
rows, err := db.Queryx(query, queryArgs...)

TA贡献1877条经验 获得超6个赞
在使用ON CONFLICT进行批量插入时,我仍然遇到错误,因此在朋友的帮助下找到了一个对我有用的解决方案。这很难找到,但你可以在这里看到更多信息。https://www.prisma.io/dataguide/postgresql/inserting-and-modifying-data/insert-on-conflict#using-the-do-update-action
...DO UPDATE SET (var1, var2, var3, var4) = (excluded.var1, excluded.var2, excluded.var3, excluded.var4)
那么你应该能够做到这一点
_, err := db.NamedExecContext(ctx, query, sliceObj)
当然,如果您不想,则不需要使用上下文
- 2 回答
- 0 关注
- 137 浏览
添加回答
举报