如何从 STDIN 将行导入到 Postgresql? [复制]

2023-12-06

在 Python 中,我有以下命令可以将行批量加载到 Postgresql,而不使用文件:

import csv
import subprocess

mylist, keys = [{'name': 'fred'}, {'name': 'mary'}], ['name']
p = subprocess.Popen(['psql', 'mydb', '-U', 'openupitsme', '-h', 'my.ip.address', '--no-password', '-c',
    '\COPY tester(%s) FROM STDIN (FORMAT CSV)' % ', '.join(keys),
    '--set=ON_ERROR_STOP=false'
    ], stdin=subprocess.PIPE
)
for d in mylist:
    dict_writer = csv.DictWriter(p.stdin, keys, quoting=csv.QUOTE_MINIMAL)
    dict_writer.writerow(d)
p.stdin.close()

我正在尝试在 Go 中实现同样的目标。我目前正在将行写入文件,然后导入它们,然后删除该文件。我想像在 Python 中一样从 STDIN 导入行。我有:

package main

import (
    "database/sql"
    "log"
    "os"
    "os/exec"

    _ "github.com/lib/pq"
)

var (
    err error
    db  *sql.DB
)

func main() {
    var err error
    fh := "/path/to/my/file.txt"
    f, err := os.Create(fh)
    if err != nil {
        panic(err)
    }
    defer f.Close()
    defer os.Remove(fh)
    rows := []string{"fred", "mary"}
    for _, n := range rows {
        _, err = f.WriteString(n + "\n")
        if err != nil {
            panic(err)
        }
    }
    // dump to postgresql
    c := exec.Command("psql", "mydb", "-U", "openupitsme", "-h", "my.ip.address", "--no-password",
        "-c", `\COPY tester(customer) FROM `+fh)
    if out, err := c.CombinedOutput(); err != nil {
        log.Println(string(out), err)
    }
}

编辑: 再进一步,但这不是插入记录:

    keys := []string{"link", "domain"}
    records := [][]string{
        {"first_name", "last_name"},
        {"Rob", "Pike"},
        {"Ken", "Thompson"},
        {"Robert", "Griesemer"},
    }

    cmd := exec.Command("psql")
    stdin, err := cmd.StdinPipe()
    if err != nil {
        log.Println(err)
    }
    stdout, err := cmd.StdoutPipe()
    if err != nil {
        log.Println(err)
    }
    if err := cmd.Start(); err != nil {
        log.Println(err)
    }
    go func() {
        _, err = io.WriteString(stdin, "search -U meyo -h 1.2.3.4 -p 1111 --no-password -c ")
        if err != nil {
            log.Println(err)
        }
        _, err := io.WriteString(stdin, fmt.Sprintf("COPY links(%s) FROM STDIN (FORMAT CSV)", strings.Join(keys, ",")))
        if err != nil {
            log.Println(err)
        }
        w := csv.NewWriter(stdin)
        if err := w.WriteAll(records); err != nil {
            log.Fatalln("error writing record to csv:", err)
        }
        w.Flush()
        if err := w.Error(); err != nil {
            log.Fatal(err)
        }
        if err != nil {
            log.Println(err)
        }
        stdin.Close()
    }()

    done := make(chan bool)
    go func() {
        _, err := io.Copy(os.Stdout, stdout)
        if err != nil {
            log.Fatal(err)
        }
        stdout.Close()
        done <- true
    }()
    <-done

    if err := cmd.Wait(); err != nil {
        log.Println(err, cmd.Args, stdout)
    }

没有插入任何记录,我收到一个无用的错误:

exit status 2

The github.com/lib/pq包文档实际上有一个例子如何做你想做的事。以下是整个程序的改编文本:

package main

import (
    "database/sql"
    "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)
    }
}

在我的机器上,大约 2 秒内导入 1 000 000 条记录。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何从 STDIN 将行导入到 Postgresql? [复制] 的相关文章

随机推荐

  • JavaFX .exe 文件因主类异常而失败

    我开发了一个 JavaFX 应用程序 并使用本机打包工具 包括 Inno Setup 5 和 WiX 来创建 exe 文件和安装程序 该程序是一个独立的应用程序 这意味着它有自己的 JRE 和 lib 文件夹中的一些外部 jar 当我安装并
  • 使用带有 typescript 的 webpack 进行反应时导入无法识别图像模块

    我遇到一个问题 在使用 webpack 加载图像文件时出现以下错误 如果我使用 webpack dev server 运行应用程序 则会显示图像 以便能够将其拉入 文件夹结构如下所示 home home tsx images test2 p
  • 如何使任何悬停颜色比原始颜色更暗/更亮

    我想要做到这一点 以便当您将鼠标悬停在某个元素上时 它总是比最初更暗或更亮 无论颜色如何 像这样但普遍的东西 darker Background red width 100px height 100px darker hover Backg
  • Laravel 调度程序日志

    哪里做Laravel 存储调度程序的日志也就是说 如果我们设置一个调度程序 间隔 2 小时 并且它已在中午 12 点执行 那么它应该在下午 2 点执行吗 Laravel 如何知道调度程序不应该在下午 1 点执行 我遇到了两种存储日志的方法
  • 需要有关如何实现 js/css 版本控制的建议

    所以我正在实现这个 js css 版本控制方案 我基本上附加了 js css 文件的校验和 我想到的策略是 基本上获取这个校验和值 然后计算文件的校验和 我认为可能来自缓存 如果它们匹配 则客户端拥有最新的文件 如果不匹配 则客户端拥有最新
  • 无法删除 mPDF 中的 PHP 通知

    我正在使用mPDF 库直接从 HTML 输出生成 PDF 文档 问题是这个 mPDF 库是按原样编写的 并且它生成了许多通知 未定义的索引 未定义的偏移量等 我尝试了一切来停止输出它们 但还没有任何帮助 我试着把error reportin
  • 数组搜索中的通配符

    是否可以在 array search 中使用通配符 我想搜索字符串的一部分 然后 类似的东西 带星号 print pos array search abitofastring vars myarray unset vars myarray
  • 针对一组 Android 项目(包括库)的 Gradle 构建

    我有 2 个 Android 应用程序 带有 5 个 Android 模块 Android 库项目 总共 7 个 Eclipse 项目 我想为他们启用 Gradle 构建 我添加了build gradle在根文件夹中并列出了所有项目sett
  • 使用新的 CSS 文件覆盖当前网站的 CSS 文件

    我的网站当前有 3 个 CSS 文件 它们会自动包含在网站中 并且我确实这样做not可以访问源代码 即索引 html网站的但我确实有访问我网站的 CSS 文件 我正在尝试使用我自己的样式来覆盖我的网站 CSS 文件 并创建一个新的 CSS
  • 在 C# 中查找字符串中的所有模式索引

    如何使用 C 查找字符串中模式的所有索引 例如我想找到所有 像这样的字符串中的模式索引45 78 56 JK01UU string pattern string sentence 45 78 56 J K01UU IList
  • 在Java中如何将数组字符向右移动?

    这就是我所拥有的 class encoded public static void main String args String s1 hello char ch s1 toCharArray for int i 0 i
  • 从控制台调用 Javascript 函数

    在 Chrome 的 JavaScript 控制台中 如何调用属于我正在查看的网页中包含的 js 文件的函数 如果它在封闭物内 我很确定你不能 否则你就这样做functionName 并按回车键
  • 不同类型的迭代器

    还有其他类型的迭代器吗 有显示不同类型迭代器的链接吗 我唯一知道的是 NET 的 IEnumerable 特别是对于 C 但也欢迎所有其他的 迭代器在不同的语言中有很多不同的东西 不仅仅是 C 迭代器 的一个明显例子是 C 迭代器 它基本上
  • Python修改函数内的列表

    我试图让函数通过传递列表的引用来修改列表 下面的程序显示 当我将列表传递到函数中时 仅生成一个局部变量 有没有什么方法可以在函数中从该列表中选择一些成员 谢谢 def func list1 list1 list1 2 print list1
  • 使用 python 解析非常大的 xml 文件时出现问题

    我有一个很大的 xml 文件 大约 84MB 其形式如下
  • 如何在 ul 下拉菜单中显示选定的菜单项

    我有一个下拉菜单 显示字体颜色供用户选择 目前 下拉列表显示 样式 但是我希望菜单标题显示当前选择的值 这是代码 HTML div class dropdown div
  • Objective-C 中的 HTTP Post 请求不起作用

    我正在编写一个 HTTP Post 请求 但由于某种原因 参数没有正确添加 而且我一生都无法弄清楚我做错了什么 这是我所拥有的 NSMutableURLRequest request NSMutableURLRequest alloc in
  • VBA - 从关闭的 Excel 工作簿中检索数据

    我正在尝试创建一个 VBA 脚本来从四个不同的工作簿收集数据 目前 我只是使用一本工作簿测试代码 但当我尝试获取数据时收到错误 虽然我想在不打开四个工作簿的情况下检索数据 但我需要打开它们才能找到最后一行数据 这是我当前的代码 Public
  • SilverStripe 4.1 - SS_DEFAULT_ADMIN_USERNAME 和 PASSWORD 不受尊重

    我有一个在 Ubuntu Vagrant VM 上运行的 SilverStripe 4 1 站点 从 3 4 升级 我有以下内容 env file Default Admin SS DEFAULT ADMIN USERNAME admin
  • 如何从 STDIN 将行导入到 Postgresql? [复制]

    这个问题在这里已经有答案了 在 Python 中 我有以下命令可以将行批量加载到 Postgresql 而不使用文件 import csv import subprocess mylist keys name fred name mary