Maison  >  Article  >  développement back-end  >  Comment effectuer efficacement des insertions en masse dans Postgres avec Go en utilisant pgx ?

Comment effectuer efficacement des insertions en masse dans Postgres avec Go en utilisant pgx ?

Barbara Streisand
Barbara Streisandoriginal
2024-11-01 10:02:02460parcourir

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

INSERT en masse dans Postgres dans Go en utilisant pgx : résolu

Dans le code Go donné, vous créez manuellement une instruction INSERT et exécutez en utilisant pgx.Exec. Cependant, cette approche peut s'avérer inefficace et sujette à des erreurs, en particulier pour les insertions groupées.

Identification du problème

Le message d'erreur « 10 arguments attendus, j'en ai obtenu 1 » indique un inadéquation entre le nombre d'arguments fournis et ceux attendus par la base de données. Cette erreur survient parce que vous construisez manuellement l'instruction INSERT et que vous avez peut-être commis une erreur dans le nombre ou la séquence d'arguments.

Approche correcte

Pour effectuer des insertions groupées efficacement, exploitez la fonction CopyFrom de pgx, qui utilise le protocole de copie PostgreSQL conçu pour de telles opérations. CopyFrom vous permet d'insérer en masse des lignes d'une source dans une table.

Exemple de code utilisant 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)
}

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn