我试图在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)
}
答案 0 :(得分:1)
使用COPY
将表导出到json文件有两种方法。
使用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)
}
使用psql和exec包。基本上,此方法以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)
根据需要调整连接参数(username
,password
,host/ip address
等)的值。有关详细信息,请参阅the documentation。