Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk Melaksanakan Sisipan Pukal dengan Cekap dalam Postgres dengan Go Menggunakan pgx?

Bagaimana untuk Melaksanakan Sisipan Pukal dengan Cekap dalam Postgres dengan Go Menggunakan pgx?

Barbara Streisand
Barbara Streisandasal
2024-11-01 10:02:02380semak imbas

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

MASUKKAN Pukal dalam Postgres dalam Go Menggunakan pgx: Diselesaikan

Dalam kod Go yang diberikan, anda membuat penyataan INSERT secara manual dan melaksanakan ia menggunakan pgx.Exec. Walau bagaimanapun, pendekatan ini boleh menjadi tidak cekap dan terdedah kepada ralat, terutamanya untuk sisipan pukal.

Pengenalan Isu

Mesej ralat "dijangka 10 argumen, mendapat 1" menunjukkan ketidakpadanan antara bilangan hujah yang disediakan dan yang dijangkakan oleh pangkalan data. Ralat ini timbul kerana anda sedang membina pernyataan INSERT secara manual dan mungkin telah membuat kesilapan dalam kiraan atau jujukan hujah.

Pendekatan Betul

Untuk melakukan sisipan pukal dengan cekap, memanfaatkan fungsi CopyFrom pgx, yang menggunakan protokol salinan PostgreSQL yang direka untuk operasi sedemikian. CopyFrom membolehkan anda memasukkan secara pukal baris daripada sumber ke dalam jadual.

Contoh Kod Menggunakan 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)
}

Atas ialah kandungan terperinci Bagaimana untuk Melaksanakan Sisipan Pukal dengan Cekap dalam Postgres dengan Go Menggunakan pgx?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn