首页  >  文章  >  后端开发  >  如何使用 pgx 在 Postgres 中高效执行批量插入?

如何使用 pgx 在 Postgres 中高效执行批量插入?

Barbara Streisand
Barbara Streisand原创
2024-11-01 10:02:02380浏览

How to Efficiently Perform Bulk Inserts in Postgres with Go Using pgx?

使用 pgx 在 Go 中的 Postgres 中批量插入:已解决

在给定的 Go 代码中,您正在手动创建 INSERT 语句并执行它使用 pgx.Exec。然而,这种方法效率低下并且容易出错,特别是对于批量插入。

问题识别

错误消息“expected 10 argument, got 1”表示提供的参数数量与数据库期望的参数数量不匹配。出现此错误的原因是您手动构建 INSERT 语句,并且可能在参数的计数或顺序中犯了错误。

正确方法

执行批量插入为了高效地利用 pgx 的 CopyFrom 函数,该函数利用专为此类操作设计的 PostgreSQL 复制协议。 CopyFrom 允许您将源中的行批量插入表中。

使用 CopyFrom 的代码示例

package main

import (
    "context"
    "fmt"
    "log"

    "github.com/jackc/pgx/v4"
)

const (
    dbUrl = "db url..."
)

type tempKey struct {
    keyVal  string
    lastKey int
}

func main() {
    conn, err := pgx.Connect(context.Background(), dbUrl)
    if err != nil {
        log.Fatalf("Error connecting to the database: %v", err)
    }
    defer conn.Close(context.Background())

    data := []tempKey{
        {keyVal: "abc", lastKey: 10},
        {keyVal: "dns", lastKey: 11},
        {keyVal: "qwe", lastKey: 12},
        {keyVal: "dss", lastKey: 13},
        {keyVal: "xcmk", lastKey: 14},
    }

    copyCount, err := conn.CopyFrom(
        context.Background(),
        pgx.Identifier{"keys"}, // Table name
        []string{"keyval", "lastval"}, // Column names
        pgx.CopyFromRows(data), // Copy from a slice of structs
    )

    if err != nil {
        log.Fatalf("Error copying data to the database: %v", err)
    }

    fmt.Printf("%d rows copied successfully.\n", copyCount)
}

以上是如何使用 pgx 在 Postgres 中高效执行批量插入?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn