首頁  >  文章  >  後端開發  >  如何有效率地將行從 STDIN 匯入到 PostgreSQL?

如何有效率地將行從 STDIN 匯入到 PostgreSQL?

Linda Hamilton
Linda Hamilton原創
2024-10-26 12:34:02239瀏覽

How to Efficiently Import Rows to PostgreSQL from STDIN?

如何從 STDIN 將行匯入到 PostgreSQL

從 STDIN 將資料列匯入到 PostgreSQL 可能是大量載入資料的有用技術。在 Go 中,這可以使用 github.com/lib/pq 套件來實現。

問題中提供的 Python 腳本利用 subprocess 模組呼叫 psql 並使用 --set=ON_ERROR_STOP 指定 COPY 命令=false 選項來處理導入過程中的任何錯誤。

Go 實作

問題中提供的 Go 程式碼最初將資料寫入文件,然後將其匯入到 PostgreSQL。然而,這種方法效率低下,並涉及建立和刪除臨時檔案。

更有效的方法是使用 pq 套件的 CopyIn() 函數直接從 STDIN 匯入資料。以下是修改後的 Go 程式碼:

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

效能對比

使用此方法,匯入 100 萬筆記錄平均需要約 2 秒。這比寫入檔案然後從磁碟導入要快得多。

以上是如何有效率地將行從 STDIN 匯入到 PostgreSQL?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn