如何在 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] 使用 COPY
的 STDIN
工具=]:
$ cat birdsong.csv | psql your_db -c "COPY birdsong (english_name, country, latitude, longitude) DELIMITER ',' CSV HEADER FROM STDIN;"
如果您打算使用 COPY
将文件导入远程数据库,此方法也很有用。
稍微无关的注释
我注意到您正在将 longitude
和 latitude
值导入到 table 中的单独列中,这对于导入数据来说很好。但是,如果您打算使用这些数据执行空间操作,我建议您将这些坐标存储在 geometry
或 geography
列中。您可以这样做:
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。
延伸阅读:
我是 运行 Manjaro Linux,正在努力学习如何使用 PostgresSQL。我已经安装了 Postgres according to the wiki,并通过 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,但我还没有想出 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] 使用 COPY
的 STDIN
工具=]:
$ cat birdsong.csv | psql your_db -c "COPY birdsong (english_name, country, latitude, longitude) DELIMITER ',' CSV HEADER FROM STDIN;"
如果您打算使用 COPY
将文件导入远程数据库,此方法也很有用。
稍微无关的注释
我注意到您正在将 longitude
和 latitude
值导入到 table 中的单独列中,这对于导入数据来说很好。但是,如果您打算使用这些数据执行空间操作,我建议您将这些坐标存储在 geometry
或 geography
列中。您可以这样做:
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。
延伸阅读: