如何在 Manjaro/Arch Linux 上将 CSV 文件复制到 pgadmin4 中? (权限问题)

How do I COPY a CSV into pgadmin4 on Manjaro/Arch Linux? (Permissions problems)

我是 运行 Manjaro Linux,正在努力学习如何使用 PostgresSQL。我已经安装了 Postgres according to the wiki,并通过 pacman 安装了 pgAdmin4。我已经使用 pgAdmin4 GUI 设置了服务器和数据库,并开始执行基本的 SQL 查询。

我正在尝试导入一个 csv,它在我的 /home/rob/Code/temp/birdsong.csv 磁盘上。在查询工具面板中,我用

创建了鸟鸣 table
-- 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,但我还没有想出 whether/how 来升级它。

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

您应该能够通过 运行 以下操作从 pgadmin 服务启用对文件的读取访问权限:

chmod o+rx /home/rob
chmod o+xr /home/rob/Code
chmod o+xr /home/rob/Code/temp
chmod o+r /home/rob/Code/temp/birdsong.csv

不过要小心,这可能不是很理想。另一种选择是将文件复制到共享位置并添加读取权限。说

cp /home/rob/Code/temp/birdsong.csv /tmp
chmod o+r /tmp/birdsong.csv

... 然后将您的 SQL 更改为从新位置复制。

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

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

如果您没有必要的权限向系统中的用户 postgres 授予访问权限,您可以通过 [=33] 使用 COPYSTDIN 工具=]:

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

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

稍微无关的注释

我注意到您正在将 longitudelatitude 值导入到 table 中的单独列中,这对于导入数据来说很好。但是,如果您打算使用这些数据执行空间操作,我建议您将这些坐标存储在 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。

延伸阅读: