ホームページ  >  記事  >  バックエンド開発  >  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 スクリプトは、サブプロセス モジュールを利用して 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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。