当语法看起来正确时,为什么PostgreSQL语句在撇号上失败



我想知道是否有人遇到过PostgreSQL对单个撇号表示异常的问题?我从linux命令行执行PostgreSQL语句,以便将csv文件中的数据复制到表中。

表已创建,文件位于正确的目录中,具有正确的权限、所有权和名称。

顶部的语法不正确,而底部看起来完全相同的语法是正确的。

--This line errors.
copy nyc_addresses from '/home/postgres/city_of_new_york.csv' WITH (FORMAT CSV, HEADER);
--This line executes successfully.
copy nyc_addresses from '/home/postgres/city_of_new_york.csv' WITH (FORMAT CSV, HEADER);

通过反复试验,我们已经确定了代码顶部的第一个撇号是问题所在,但无法弄清楚原因。

如果有帮助,则显示的错误为:

/home/postgres/city_of_new_york.csv: No such file or directory

有人能解释一下这可能是什么原因吗?

PostgreSQL的COPYcsv文件的替代方案是cat,并将它们管道传输到COPY命令FROM STDIN。无论数据库是安装在本地还是安装在远程服务器中,这种方法都有效。

$ cat file.csv | psql -U user -d db -c "COPY table FROM STDIN CSV HEADER"

EDIT:正如Nick Barnes所指出的(见评论(,cat显然需要与copy具有相同的权限,这并不能解决神秘的OP问题。

@Jetchill提出了以下替代方案,其效果与cat相同,但对一些用户来说可能更直观:

psql -U user -d db -c "COPY table FROM STDIN CSV HEADER" < file.csv

最新更新