Golang Postgres如何将表转储到JSON中

时间:2017-10-10 21:03:05

标签: postgresql go

我试图在Go 1.9中为许多表(一次一个表)运行此命令:

COPY (select row_to_json(foo) FROM (SELECT * FROM bar) foo ) TO '/tmp/bar.json';

这甚至可能吗?似乎用lib / pg,它不是。使用go-pg,我一直在耗尽内存,因为它首先将它全部缓冲到内存中。

从命令提示符执行此操作正常。我宁愿使用Go的PG库而不是在命令提示符下运行它。

简而言之,我试图将整个表转储到他们自己文件中的JSON中。

有没有人成功完成这项工作?

谢谢!

编辑:

由于lb / pg根本不支持,所以我使用pg-go。这是代码:

var buf bytes.Buffer
    _, err := db.CopyTo(&buf, "COPY (select row_to_json(foo) FROM (SELECT * FROM bar) r ) TO '/tmp/bar.json'")
    if err != nil {
        panic(err)
    }

1 个答案:

答案 0 :(得分:1)

使用COPY将表导出到json文件有两种方法。

  1. 使用go-pg。为避免内存不足问题,应将结果直接写入文件,而不是将结果写入缓冲区。这些片段将是:

    //open database connection first
    db := pg.Connect(&pg.Options{
        User:     "username",
        Password: "password",
        Database: "database",
        Addr:     "192.168.1.2:5432",   //database address
    })
    defer db.Close()
    
    //open output file
    out, err := os.Create("/tmp/bar.json")
    if err != nil {
        panic(err)
    }
    defer out.Close()
    
    //execute opy
    copy := `COPY (SELECT row_to_json(foo) FROM (SELECT * FROM bar) foo ) TO STDOUT`
    _, err = db.CopyTo(out, copy)
    if err != nil {
        panic(err)
    }
    
  2. 使用psqlexec包。基本上,此方法以psql的形式执行psql -c query1 -c query2 ... args命令。请注意,此方法要求已安装psql。摘录:

    queries := []string{
        `SET client_encoding='UTF8'`,
        `\COPY (SELECT row_to_json(foo) FROM (SELECT * FROM bar) foo ) TO '/tmp/bar.json'`,
    }
    dsn := "postgresql://username:password@192.168.1.2/database"
    
    //construct arguments
    args := []string{}
    for _, q := range queries {
        args = append(args, "-c", q)
    }
    args = append(args, dsn)
    
    //Execute psql command
    cmd := exec.Command("psql", args...)
    stdoutStderr, err := cmd.CombinedOutput()
    if err != nil {
        panic(err)
    }
    fmt.Printf("%s\n", stdoutStderr)
    
  3. 注意

    根据需要调整连接参数(usernamepasswordhost/ip address等)的值。有关详细信息,请参阅the documentation