sql - 如何在 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?
解决方案
该错误消息表明数据库没有访问该文件的权限/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
工具:COPY
psql
$ cat birdsong.csv | psql your_db -c "COPY birdsong (english_name, country, latitude, longitude) DELIMITER ',' CSV HEADER FROM STDIN;"
COPY
如果您打算将文件导入远程数据库,这种方法也很有用。
稍微无关的注释
我注意到您正在以分隔列的形式将值导入表longitude
中latitude
,为了导入数据,这很好。但是,如果您打算对这些数据执行空间操作,我建议您将这些坐标存储在一个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。
进一步阅读:
推荐阅读
- c - 计算和打印矩阵的对角线之和
- javascript - 如何在 Angular 中使用 addEventListener 和 postMessage?
- php - 如何将日期、时间和值从单选按钮放入数据库
- c# - 逐个像素地动态绘制和显示,有一些延迟
- npm - 如何从 Nexus oss 代理获取依赖于 github 项目的 npm 包
- django - Django 测试 - 发送包含整数的数组数组
- android - 在 android 中使用改造登录
- json - 我如何在 nunjuncks 中乘以数据?
- swift - 为什么不能在swift中将可变参数标记为inout?
- vue.js - Vue Js 2 / Vue-CLI 3 / 托管时显示空白页