从 STDIN 将行导入到 PostgreSQL 可能是批量加载数据的有用技术。在 Go 中,这可以使用 github.com/lib/pq 包来实现。
问题中提供的 Python 脚本利用 subprocess 模块调用 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中文网其他相关文章!