Heim  >  Artikel  >  Backend-Entwicklung  >  Wie führt man mithilfe von pgx effizient Masseneinfügungen in Postgres mit Go durch?

Wie führt man mithilfe von pgx effizient Masseneinfügungen in Postgres mit Go durch?

Barbara Streisand
Barbara StreisandOriginal
2024-11-01 10:02:02380Durchsuche

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

Massen-INSERT in Postgres in Go mit pgx: Behoben

Im angegebenen Go-Code erstellen Sie manuell eine INSERT-Anweisung und führen sie aus es mit pgx.Exec. Dieser Ansatz kann jedoch ineffizient und fehleranfällig sein, insbesondere bei Masseneinfügungen.

Problemidentifizierung

Die Fehlermeldung „10 Argumente erwartet, 1 erhalten“ weist auf ein Nichtübereinstimmung zwischen der Anzahl der bereitgestellten Argumente und den von der Datenbank erwarteten. Dieser Fehler tritt auf, weil Sie die INSERT-Anweisung manuell erstellen und möglicherweise einen Fehler bei der Anzahl oder Reihenfolge der Argumente gemacht haben.

Richtiger Ansatz

Um Masseneinfügungen durchzuführen Nutzen Sie effizient die CopyFrom-Funktion von pgx, die das für solche Vorgänge entwickelte PostgreSQL-Kopierprotokoll verwendet. Mit CopyFrom können Sie Zeilen aus einer Quelle in großen Mengen in eine Tabelle einfügen.

Codebeispiel für die Verwendung von 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)
}

Das obige ist der detaillierte Inhalt vonWie führt man mithilfe von pgx effizient Masseneinfügungen in Postgres mit Go durch?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn