PostgreSQL导入CSV文件导致语法错误


8

我正在尝试通过“ COPY”命令将CSV文件导入数据库;但是,出现了(看起来很常见)错误,我需要成为超级用户,而应该使用“ \ copy”。但是,当使用\ copy时,出现语法错误:

ERROR:  syntax error at or near "\"
LINE 1: \copy

插入符号指向“ \”。这是我的查询:

\copy tablename(column2, column3, column4, column5) from '/home/uploads/data.csv' WITH DELIMITER ',' CSV HEADER'

我尝试了“复制”和“ \复制”。第一个给我一个超级用户错误,第二个给了我语法错误。关于如何解决它的任何想法?让它起作用?

我正在通过myPgAdmin的sql输入字段执行命令。

我唯一的其他问题是关于通过tablename(column2,column3等等)导入列。那是正确的语法吗?

Answers:


8

\copypsql(命令行)命令。这不是常规的SQL命令。

您将需要使用COPY代替(但这要求文件存在于数据库服务器上)


您将如何直接通过SQL而不是使用命令行导入CSV文件?
antjanus 2012年

1
@antjanus:您将使用COPY命令,正如我已经提到过的(以及adam的详细解释)
a_horse_with_no_name 2012年

同样,这需要超级用户权限并且不安全,对吗?
antjanus 2012年

4

请参阅postgres 手册以获取COPY

在pgAdmin(或通过脚本或其他数据库连接传递的sql字符串)中,您将只使用不带“ \”前缀的COPY。

所以输入类似: COPY tablename....

您需要确保您具有运行命令的相关特权,因此在这种情况下,您需要能够登录数据库并对“表名”具有写权限。Postgres还需要能够访问该文件,因此应该在数据库服务器上可以访问/ home / uploads /路径,并且postgres用户应该可以读取该文件-检查文件和目录的权限。


2

在我的9.1系统上,我得到的错误非常有用:

or_examples=> copy comp_table_test from '/tmp/test';
ERROR:  must be superuser to COPY to or from a file
HINT:  Anyone can COPY to stdout or from stdin. psql's \copy command also works for anyone.

如果再次仔细阅读提示,则说明可以从stdin复制。这就是psql中的\ copy在后端实际执行的操作。有关更多信息,请参见http://www.postgresql.org/docs/8.3/static/sql-copy.html上的文档。

然后,您可以将副本的主体放入查询中,或者至少这就是它在psql中的工作方式。


1
copy coordina from '/tmp/filename.txt' WITH NULL AS ;

这就是我在pgAdmin3中所做的。但是请仔细检查用户权利,有时是问题所在。(用户postgres在filename.txt / chmod 777上)


您必须是数据库超级用户才能执行此操作,尽管因此是最初的投诉。
克里斯·特拉弗斯

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.