首页 > 解决方案 > 如何在 Manjaro/Arch Linux 上将 CSV 复制到 pgadmin4 中?(权限问题)

问题描述

我正在运行 Manjaro Linux 并尝试学习如何使用 PostgresSQL。我已经根据 wiki安装了 Postgres ,并通过 pacman 安装了 pgAdmin4。我已经使用 pgAdmin4 GUI 设置了一个服务器和一个数据库,并且已经开始进行基本的 SQL 查询。

我正在尝试导入一个 csv,它位于我的磁盘上/home/rob/Code/temp/birdsong.csv。在查询工具面板中,我创建了鸟鸣表

-- Drop table if exists
DROP TABLE IF EXISTS bird_song;

-- Create new table
CREATE TABLE birdsong (
    english_name VARCHAR,
    country VARCHAR,
    latitude DEC,
    longitude DEC
 );

 COPY birdsong (english_name, country, latitude, longitude)
 FROM '/home/rob/Code/temp/birdsong.csv' DELIMITER ',' CSV HEADER;

我得到了错误ERROR: could not open file "/home/rob/Code/temp/birdsong.csv" for reading: Permission denied

我在 PostgresSQL 12.1 和 pgAdmin4 4.15 上。顺便说一句,当我启动 pgAdmin4 时,它抱怨最新版本是 4.17,但我还没有弄清楚是否/如何升级它。

如何安排正确的权限设置以将文件读入 pgAdmin4?

标签: sqllinuxpostgresqlpgadmin-4

解决方案


该错误消息表明数据库没有访问该文件的权限/home/rob/Code/temp/birdsong.csv。您需要授予对数据库用户的访问权限 - 通常称为postgres. 检查如何在您的操作系统中执行此操作,例如chown在 Linux 中并尝试再次使用 COPY。

 COPY birdsong (english_name, country, latitude, longitude)
 FROM '/home/rob/Code/temp/birdsong.csv' DELIMITER ',' CSV HEADER;

如果您没有必要的权限来授予postgres系统中用户的访问权限,您可以使用via的STDIN工具:COPYpsql

$ cat birdsong.csv | psql your_db -c "COPY birdsong (english_name, country, latitude, longitude) DELIMITER ',' CSV HEADER FROM STDIN;"

COPY如果您打算将文件导入远程数据库,这种方法也很有用。

稍微无关的注释

我注意到您正在以分隔列的形式将值导入表longitudelatitude,为了导入数据,这很好。但是,如果您打算对这些数据执行空间操作,我建议您将这些坐标存储在一个geometrygeography列中。您可以这样做:

SELECT AddGeometryColumn ('public','birdsong','geom',4326,'POINT',2);

或者

ALTER TABLE birdsong ADD COLUMN geom geometry(Point,4326);

..然后geom用一个点填充列

UPDATE birdsong SET geom = ST_SetSRID(ST_MakePoint(longitude,latitude),4326);

数字 4326 代表 SRS WGS84- 最常用的 SRS。

进一步阅读:


推荐阅读