2 回答

TA貢獻(xiàn)1780條經(jīng)驗(yàn) 獲得超5個贊
我想自己回答這個問題,作為一個開發(fā)人員,我的第一個本能是查看堆棧溢出并將其傳達(dá)給人們
我相信sqlx中的批量upsert是最近在1.3.0中引入的。它在README中有詳細(xì)說明,但作為一個ORM,它是一堆PR已經(jīng)轉(zhuǎn)發(fā)并還原了更改以支持多種SQL風(fēng)格。
識別查詢是否是批量查詢的當(dāng)前正則表達(dá)式期望查詢以空格或括號結(jié)尾,基本上是占位符。
請在此處查看提交。
為了解決這個問題,我能夠使用內(nèi)部函數(shù)和一些旁路來使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貢獻(xiàn)1877條經(jīng)驗(yàn) 獲得超6個贊
在使用ON CONFLICT進(jìn)行批量插入時,我仍然遇到錯誤,因此在朋友的幫助下找到了一個對我有用的解決方案。這很難找到,但你可以在這里看到更多信息。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)
那么你應(yīng)該能夠做到這一點(diǎn)
_, err := db.NamedExecContext(ctx, query, sliceObj)
當(dāng)然,如果您不想,則不需要使用上下文
- 2 回答
- 0 關(guān)注
- 119 瀏覽
添加回答
舉報