使用golang pgxpool的Postgres表批量更新未反映在数据库中

问题描述

我需要使用新转换的ID(作为“记录”传递)更新一个相当大的psql表。我在下面创建了此功能以利用pgxpool的连接池并请求批处理,如果我使用其他客户端应用这些事务,它们将更新数据库,如果我查看打印出的结果,它们表明每次1行都受到影响,但是当我从数据库中检索这些行,它们保持不变。我是否以某种方式错误地使用了批处理?

B

打印输出

B.bar()

解决方法

根据@Adrian Klaver的建议,我进行了以下更改以完成交易:

  1. 仍然需要明确地执行交易

  2. 在SendBatch之后,事务连接将保持打开状态。在使用connetion进行提交之前,可能需要释放它们。

以下是更改后的代码:

import (
    ...
    "github.com/jackc/pgconn"
    "github.com/jackc/pgx/v4"
    "github.com/jackc/pgx/v4/pgxpool"

    log "github.com/sirupsen/logrus"
)

func SetNewSubscriptionValuesBatch(dsn string,records map[string]string) error {

    ctx := context.Background()
    var db *pgxpool.Pool

    db,err := pgxpool.Connect(ctx,dsn)
    defer db.Close()
    if err != nil {
        panic(err)
    }
    
    tx,err := db.Begin(ctx)
    if err != nil {
        panic(err)
    }

    b := &pgx.Batch{}

    for id,subID := range records {

    sqlStatement := `
UPDATE event
SET subscription_id_2 = $2
WHERE id = $1;`
        b.Queue(sqlStatement,id,subID)
    }
    
    batchResults := tx.SendBatch(ctx,b)
    
    var qerr error
    var rows pgx.Rows
    for qerr == nil {
        rows,qerr = batchResults.Query()
        rows.Close()
    }
    
    return tx.Commit(ctx)
}