使用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 ','
还有其他几种排列会产生类似的错误。
使用的网络资源
答案 0 :(得分:2)
关于权限:
不要忘记,要访问文件,您需要路径中所有目录的权限。因此,例如,如果操作系统用户postgres
没有/home/MyUser
目录的权限,则会收到观察到的错误消息。
关于\copy
:
您必须使用-c
选项向psql
提供命令:
$ psql -c "\copy sample FROM '/home/MyUser/data/TableName.csv' WITH (FORMAT CSV)"