Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk Mengimport Baris dengan Cekap ke PostgreSQL dari STDIN?

Bagaimana untuk Mengimport Baris dengan Cekap ke PostgreSQL dari STDIN?

Linda Hamilton
Linda Hamiltonasal
2024-10-26 12:34:02239semak imbas

How to Efficiently Import Rows to PostgreSQL from STDIN?

Cara Mengimport Baris ke PostgreSQL daripada STDIN

Mengimport baris ke PostgreSQL daripada STDIN boleh menjadi teknik yang berguna untuk memuatkan data secara pukal. Dalam Go, ini boleh dicapai menggunakan pakej github.com/lib/pq.

Skrip Python yang disediakan dalam soalan menggunakan modul subproses untuk memanggil psql dan nyatakan arahan COPY dengan --set=ON_ERROR_STOP =pilihan palsu untuk mengendalikan sebarang ralat semasa proses import.

Pelaksanaan Go

Kod Go yang disediakan dalam soalan pada mulanya menulis data ke fail dan kemudian mengimportnya ke dalam PostgreSQL. Walau bagaimanapun, kaedah ini tidak cekap dan melibatkan penciptaan dan pemadaman fail sementara.

Pendekatan yang lebih cekap ialah menggunakan fungsi CopyIn() pakej pq untuk mengimport terus data daripada STDIN. Berikut ialah kod Go yang diubah suai:

<code class="go">package main

import (
    "database/sql"
    "fmt"
    "log"

    "github.com/lib/pq"
)

func main() {
    // Open the database connection.
    db, err := sql.Open("postgres", "dbname=postgres user=postgres password=postgres")
    if err != nil {
        log.Fatalf("open: %v", err)
    }
    defer db.Close()

    // Prepare the COPY statement.
    stmt, err := pq.CopyIn(db, "test", "first_name", "last_name")
    if err != nil {
        log.Fatalf("prepare: %v", err)
    }

    // Create some sample data.
    records := [][]string{
        {"Rob", "Pike"},
        {"Ken", "Thompson"},
        {"Robert", "Griesemer"},
    }

    // Iterate over the records and write them to STDIN.
    for _, r := range records {
        _, err = fmt.Fprintf(stmt, "%s\t%s\n", r[0], r[1])
        if err != nil {
            log.Fatalf("exec: %v", err)
        }
    }

    // Signal the end of the COPY statement.
    _, err = stmt.Exec()
    if err != nil {
        log.Fatalf("exec: %v", err)
    }

    // Close the COPY statement.
    err = stmt.Close()
    if err != nil {
        log.Fatalf("stmt close: %v", err)
    }

    // Commit the transaction.
    if err = db.Commit(); err != nil {
        log.Fatalf("commit: %v", err)
    }

    fmt.Println("Data imported successfully.")
}</code>

Perbandingan Prestasi

Menggunakan kaedah ini, mengimport 1 juta rekod mengambil masa kira-kira 2 saat secara purata. Ini jauh lebih pantas daripada menulis ke fail dan kemudian mengimport daripada cakera.

Atas ialah kandungan terperinci Bagaimana untuk Mengimport Baris dengan Cekap ke PostgreSQL dari STDIN?. 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