从 STDIN 导入行到 PostgreSQL
在 Python 中,subprocess 模块提供了一种使用 COPY 将数据从 STDIN 写入 PostgreSQL 的便捷方法命令。然而,在 Go 中实现相同的功能需要不同的方法。
github.com/lib/pq 包的官方文档提供了如何使用 CopyIn 函数直接从 STDIN 导入记录的示例。以下是所提供代码的改编版本:
<code class="go">package main import ( "database/sql" "fmt" "log" "github.com/lib/pq" ) func main() { records := [][]string{ {"Rob", "Pike"}, {"Ken", "Thompson"}, {"Robert", "Griesemer"}, } db, err := sql.Open("postgres", "dbname=postgres user=postgres password=postgres") if err != nil { log.Fatalf("open: %v", err) } if err = db.Ping(); err != nil { log.Fatalf("open ping: %v", err) } defer db.Close() txn, err := db.Begin() if err != nil { log.Fatalf("begin: %v", err) } stmt, err := txn.Prepare(pq.CopyIn("test", "first_name", "last_name")) if err != nil { log.Fatalf("prepare: %v", err) } for _, r := range records { _, err = stmt.Exec(r[0], r[1]) if err != nil { log.Fatalf("exec: %v", err) } } _, err = stmt.Exec() if err != nil { log.Fatalf("exec: %v", err) } err = stmt.Close() if err != nil { log.Fatalf("stmt close: %v", err) } err = txn.Commit() if err != nil { log.Fatalf("commit: %v", err) } log.Println("Records successfully imported") }</code>
此修订后的代码使用事务来确保导入过程中的原子性、一致性、隔离性和持久性 (ACID) 属性。 CopyIn 函数允许您指定目标表名称以及将插入数据的列。
然后使用准备好的语句将提供的示例数据插入到“测试”表中。准备好的语句通过预编译 SQL 查询来提高性能,减少与解析和规划相关的开销。
插入所有记录后,事务将被提交,数据将永久存储在数据库中。
以上是如何在 Go 中将行从 STDIN 导入到 PostgreSQL?的详细内容。更多信息请关注PHP中文网其他相关文章!