pgx を使用して Go で Postgres に一括挿入を効率的に実行する方法

Barbara Streisand
リリース: 2024-11-01 10:02:02
オリジナル
466 人が閲覧しました

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

pgx を使用した Go の Postgres での一括 INSERT: 解決済み

指定された Go コードで、INSERT ステートメントを手動で作成して実行していますpgx.Execを使用します。ただし、このアプローチは、特に一括挿入の場合、非効率的でエラーが発生しやすい可能性があります。

問題の識別

エラー メッセージ「expected 10 argument, got 1」は、提供された引数の数とデータベースが予期する引数の数が一致していません。このエラーは、INSERT ステートメントを手動で作成しており、引数の数または順序を間違えた可能性があるために発生します。

正しいアプローチ

一括挿入を実行するにはこのような操作用に設計された PostgreSQL コピー プロトコルを利用する pgx の CopyFrom 機能を効率的に活用します。 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 を使用して Go で Postgres に一括挿入を効率的に実行する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート