postgresql 中的复制命令以追加数据

Spi*_*ike 5 postgresql postgresql-9.1 copy

我正在copy从函数执行命令

execute 'copy (select * from tableName) to ''/tmp/result.txt'''
Run Code Online (Sandbox Code Playgroud)

它工作正常。但是,tableName是动态的,将有更多的表(循环迭代)。result.txt只有最后一次迭代(表)数据。

如果必须的话,我可以通过命令行使用\o>>附加到文件中。但是,我必须使用该功能。

我读了http://shuber.io/reading-from-the-filesystem-with-postgres/。它建议使用临时表的解决方案。我可以做类似的事情,但没有临时表吗?(我必须避免归档日志)。创建临时表会创建存档日志吗?

有没有办法copy在函数中附加命令?

Dan*_*ité 6

假设一个 Unix 系统

使用 PostgreQSL 9.3 或更新版本

使用 PROGRAM 子句 with catas the program。

execute 'copy (select * from tableName) to PROGRAM ''cat >>/tmp/result.txt'''
Run Code Online (Sandbox Code Playgroud)

这会将结果附加到文件的末尾/tmp/result.txt而不是覆盖文件。

使用旧版本的 PostgreSQL

单独的进程可以使用命名管道来连接结果。例子:

$ mkfifo /tmp/pgfifo
$ while true; do cat /tmp/pgfifo >>/tmp/result.txt; done
Run Code Online (Sandbox Code Playgroud)

最后一条命令将被阻止。让它一直运行,直到所有的结果都累积,然后可以用^C或kill终止。

在 SQL 中,fifo 必须输入:

execute 'copy (select * from tableName) to ''/tmp/pgfifo'''
Run Code Online (Sandbox Code Playgroud)


dez*_*zso 4

我认为你不能(轻松)做到这一点(至少在你的 PostgreSQL 版本上,请参阅丹尼尔的回答)。但是,您绝对可以改变您的方法,并UNION ALLCOPY. 这意味着没有循环,但您必须根据收集的表名称构建查询。

结果看起来像

COPY (SELECT * FROM table1
      UNION ALL
      SELECT * FROM table2
      ...) 
    TO tmp/result.txt;
Run Code Online (Sandbox Code Playgroud)

笔记:

  • 不存在psql函数这样的东西。psql是 PostgreSQL 的客户端。然而,它有内置命令(基本上所有以 开头的命令\)。
  • 目前还不清楚“归档日志”是什么意思。如果是预写日志(WAL),那么用上面的方法就不用担心了。否则,您可以使用未记录的表
  • 如果表很大,您的系统有可能会写入(大量)临时文件。这可能会使执行速度不那么快。