首頁  >  文章  >  後端開發  >  如何使用 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