首页  >  文章  >  后端开发  >  如何在 Go 中将行从 STDIN 导入到 PostgreSQL?

如何在 Go 中将行从 STDIN 导入到 PostgreSQL?

Linda Hamilton
Linda Hamilton原创
2024-10-24 14:20:53865浏览

How to Import Rows to PostgreSQL from STDIN in Go?

从 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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn