STDIN から PostgreSQL に行をインポートすることは、データを一括ロードする場合に便利な手法です。 Go では、これは github.com/lib/pq パッケージを使用して実現できます。
質問で提供されている Python スクリプトは、サブプロセス モジュールを利用して psql を呼び出し、--set=ON_ERROR_STOP で COPY コマンドを指定します。インポート プロセス中のエラーを処理するための =false オプション。
質問で提供されている 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 サイトの他の関連記事を参照してください。