Postgres:\ copy语法

时间:2018-02-19 19:31:11

标签: postgresql

使用CentOS 7上的PostgreSQL 9.5,我创建了一个名为sample的数据库以及几个表。我在每个表的.csv中都有/home/MyUser/data个数据。  例如,表TableName.csv存在"TableName"

如何将csv文件加载到每个表中?

我尝试过的东西不起作用,我无法弄清楚我做错了什么。

从数据库中加载

$ psql sample

sample=# COPY "TableName" FROM '/home/MyUser/data/TableName.csv' WITH CSV;

ERROR:  could not open file "/home/MyUser/data/TableName.csv" for reading: Permission denied

这意味着文件权限问题。 data/中的所有文件均为-rw-r--r--,目录本身为drwxr-xr-x。所以文件权限应该不是问题(除非我遗漏了什么)。互联网表示COPY存在权限问题并尝试\copy

从CLI加载

$ psql \copy sample FROM /home/MyUser/data/TableName.csv WITH CSV

psql: warning: extra command-line argument "FROM" ignored
psql: warning: extra command-line argument "/home/MyUser/data/TableName.csv" ignored
psql: warning: extra command-line argument "WITH" ignored
psql: warning: extra command-line argument "CSV" ignored
psql: FATAL:  Peer authentication failed for user "sample"

这似乎是语法错误,但我发现文档特别有用(man psql然后/\copy)。我也尝试了以下相同的结果。

$ psql \copy sample."TableName" FROM /home/MyUser/data/TableName.csv WITH CSV
$ psql \copy sample FROM /home/MyUser/data/TableName.csv WITH DELIMITER ','

还有其他几种排列会产生类似的错误。

使用的网络资源

1 个答案:

答案 0 :(得分:2)

关于权限:

不要忘记,要访问文件,您需要路径中所有目录的权限。因此,例如,如果操作系统用户postgres没有/home/MyUser目录的权限,则会收到观察到的错误消息。

关于\copy

您必须使用-c选项向psql提供命令:

$ psql -c "\copy sample FROM '/home/MyUser/data/TableName.csv' WITH (FORMAT CSV)"