2014-02-20 39 views
0

我想用复制命令将数据复制到postgres中;而其他进程正在同时写入CSV文件。Postgres COPY命令尾部文件?

是这样的可能吗?从尾部和管道输入stdout到postgres的stdin。

COPY targetTable (column1, column2) 
    FROM `tail -f 'path/to/data.csv'` 
    WITH CSV 
+0

psql版本'\ copy'可能工作。它至少支持从stdin和pstdin读取数据。有关详细信息,请尝试'man psql'。 –

回答

1

假设的PostgreSQL 9.3或更好,有复制从程序输出的可能性与:

COPY FROM PROGRAM 'command' 

the doc

PROGRAM

执行以下步骤的命令。在COPY FROM中,从标准输出 中读取输入的命令,并在COPY TO中将输出写入 标准输入的命令。

这可能是你需要的,除了tail -f是一个永无止境的设计命令这一事实,你不清楚COPY的计划是如何完成的。据推测,你需要用一些更复杂的脚本替换tail -f以及一些退出条件。

+0

可能值得一提的是,在这种情况下,命令是由postgres用户执行的,而不是运行psql的用户或任何客户端,因此权限可能是一个问题。 – harmic

+0

这是一个很好的观点。我会用一些退出的脚本来替换tail -f。谢谢丹尼尔! – samol

0

你也可以从STDIN复制; 示例:

tail -f datafile.csv | psql -tc "COPY table from STDIN" database 
+0

原本是I + 1ed,但DanielVérité说得很好:'tail -f'永远不会结束! –

+0

这实际上是否有效,甚至忽略了它将如何结束的问题?我原以为你必须使用\从pstdin复制。 SQL命令中的STDIN表示“来自客户端连接”,不一定是客户端本身的标准输入。 – harmic

+0

在这里寻找使用'tail'仅用于'.sql'文件中的最后一个记录。 'tail -n 1 datafile.sql | psql数据库-tc“\ COPY表FROM STDIN”' –