为什么 psql 将 COPY 之后的语句视为标准输入?
示例脚本:
CREATE TEMPORARY TABLE foo(col1 text);
COPY foo from STDIN DELIMITER E'\t' CSV HEADER;
SELECT * FROM foo;
执行:
psql --host=localhost --dbname=postgres --username=postgres \
--file=my-script.sql < my-data.tsv
当我运行此脚本时,会发生一些奇怪的事情。 SELECT * FROM foo
不会运行,而是 COPY
语句下面的所有内容都被视为要输入到我的表中的行。
如何编写从标准输入导入数据表并对其进行进一步处理的 SQL 脚本?
Example script:
CREATE TEMPORARY TABLE foo(col1 text);
COPY foo from STDIN DELIMITER E'\t' CSV HEADER;
SELECT * FROM foo;
Execution:
psql --host=localhost --dbname=postgres --username=postgres \
--file=my-script.sql < my-data.tsv
When I run this, something peculiar happens. SELECT * FROM foo
doesn't run, and instead everything below the COPY
statement is treated as rows to be entered into my table.
How can I write a SQL script that imports a data table from standard input and does further processing with it?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
psql 将
--file
脚本视为标准输入,因此它期望您的数据集立即遵循COPY
语句。有一个解决方法,按照 Postgres 邮件中的此电子邮件列表:psql treats
--file
scripts as if they were standard input, so it's expecting your data set to immediately follow theCOPY
statement. There is a workaround, as per this email on the Postgres mailing list: