Bagaimana untuk Mengimport Baris dengan Cekap ke PostgreSQL dari STDIN?

Linda Hamilton
Lepaskan: 2024-10-26 12:34:02
asal
257 orang telah melayarinya

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>
Salin selepas log masuk

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!

sumber:php
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!