Heim  >  Artikel  >  Backend-Entwicklung  >  Wie importiert man Zeilen effizient von STDIN in PostgreSQL?

Wie importiert man Zeilen effizient von STDIN in PostgreSQL?

Linda Hamilton
Linda HamiltonOriginal
2024-10-26 12:34:02239Durchsuche

How to Efficiently Import Rows to PostgreSQL from STDIN?

So importieren Sie Zeilen von STDIN nach PostgreSQL

Das Importieren von Zeilen von STDIN nach PostgreSQL kann eine nützliche Technik für das Massenladen von Daten sein. In Go kann dies mit dem Paket github.com/lib/pq erreicht werden.

Das in der Frage bereitgestellte Python-Skript verwendet das Subprocess-Modul, um psql aufzurufen und den COPY-Befehl mit --set=ON_ERROR_STOP anzugeben =false-Option zur Behandlung etwaiger Fehler während des Importvorgangs.

Go-Implementierung

Der in der Frage bereitgestellte Go-Code schreibt die Daten zunächst in eine Datei und importiert sie dann in PostgreSQL. Diese Methode ist jedoch ineffizient und erfordert das Erstellen und Löschen temporärer Dateien.

Ein effizienterer Ansatz besteht darin, die CopyIn()-Funktion des pq-Pakets zu verwenden, um Daten direkt aus STDIN zu importieren. Hier ist der modifizierte Go-Code:

<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>

Leistungsvergleich

Mit dieser Methode dauert der Import von 1 Million Datensätzen durchschnittlich etwa 2 Sekunden. Dies ist wesentlich schneller als das Schreiben in eine Datei und das anschließende Importieren von der Festplatte.

Das obige ist der detaillierte Inhalt vonWie importiert man Zeilen effizient von STDIN in PostgreSQL?. 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