来自STDIN的psql副本和来自echo的管道

来自STDIN的psql副本和来自echo的管道,sql,postgresql,psql,Sql,Postgresql,Psql,我正在使用Postgresql 9.5。在我的代码中,我需要创建一个管道来提取数据并插入到数据库中。为了使用psql测试管道,我在数据库中创建了一个表:employee(name、dept、jobtitle),并使用以下命令: echo -e "Paul,IT,Manager\n\." | psql -U *** -h localhost -d *** -1f copy.sql copy.sql文件如下: COPY employee (name,dept,jobtitle) from STDI

我正在使用Postgresql 9.5。在我的代码中,我需要创建一个管道来提取数据并插入到数据库中。为了使用psql测试管道,我在数据库中创建了一个表:employee(name、dept、jobtitle),并使用以下命令:

echo -e "Paul,IT,Manager\n\." | psql -U *** -h localhost -d *** -1f copy.sql
copy.sql文件如下:

COPY employee (name,dept,jobtitle) from STDIN WITH(FORMAT CSV, DELIMITER ',', HEADER FALSE)
该命令的结果是:

COPY 0
我猜psql解析器不会从输入中识别任何行。是因为回声输入格式错误吗?感谢您的帮助。谢谢


我还尝试使用\COPY命令从csv文件复制。它成功了。使用的命令是

psql -U *** -h localhost -d *** -1f copy_file.sql
copy_file.sql是:

\copy employee (name,dept,jobtitle) from '/path/to/csv/file' WITH(FORMAT CSV, DELIMITER ',', HEADER FALSE)
csv文件是

Paul,IT,Manager
\.

我测试它是因为它是一个有趣的问题。如果将“verbose”(-v)添加到原始psql命令中,您将看到错误消息。问题在于管道-管道psql忽略“-f”参数,因此也会复制文件中的命令,并仅从管道获取所有输入。当我使用
echo-e“$(cat copy.sql)\n…data…| psql…
猜猜看:当
psql
执行脚本文件时,它假设数据正好在
copy之后出现。。。从stdin…
命令,并将其发送到
副本,而不是“实际”stdin。您可以执行
copy。。。从…起stdin
命令使用
-psql
-c
选项,它应该可以工作。@JosMac很好。我添加了“-v VERBOSITY verbose”,没有得到任何错误。我不认为psql会忽略管道中的“-f”参数,因为结果是“copy 0”,这意味着psql“看到”了copy命令。原因可能是使用“-f”参数psql会忽略标准输入。你能分享echo-e$(cat copy.sql)的完整代码吗?…数据…| psql…
?@Abelisto很好!以下代码起作用:
echo“Paul,IT,Manager”| psql-U postgres-h localhost-d basick-1c“从STDIN复制员工(姓名、部门、职务),格式为(CSV,标题为FALSE)
。我猜它假定-f参数与STDIN不兼容。