亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

我們如何在 sqlx 中為 postgres 實現批量 upsert?

我們如何在 sqlx 中為 postgres 實現批量 upsert?

Go
慕少森 2022-08-24 10:31:13
所以我一直在嘗試批量更新。Postgres開箱即用地支持它。示例查詢INSERT INTO table(col1, col2, col3, eligible ,created_at, updated_at)                    VALUES (:col1, :col2, :col3 :eligible ,now(), now())                      ON CONFLICT (col1, col2)                     DO UPDATE SET col2 = excluded.col2,eligible = excluded.eligible, updated_at = now() RETURNING *我希望能夠做的是使用jmoiron/sqlx庫使用命名功能創建批量更新插入。正如這里提到的Github問題,我無法這樣做。
查看完整描述

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...)


查看完整回答
反對 回復 2022-08-24
?
慕哥9229398

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)

當然,如果您不想,則不需要使用上下文


查看完整回答
反對 回復 2022-08-24
  • 2 回答
  • 0 關注
  • 136 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號