在命令行中使用PostgreSQL导入CSV文件

12 浏览
0 Comments

在命令行中使用PostgreSQL导入CSV文件

我一直在使用psql Postgres终端来导入CSV文件到表中,使用以下命令:

COPY tbname FROM
'/tmp/the_file.csv'
delimiter '|' csv;

这个命令很好用,但是我必须登录到psql终端才能运行它。

我想知道是否有方法从Linux shell命令行执行类似于此的命令,就像Postgres允许使用以下命令一样:

/opt/postgresql/bin/pg_dump dbname > /tmp/dbname.sql

这允许从Linux shell导出数据库而无需登录到psql终端。

admin 更改状态以发布 2023年5月21日
0
0 Comments

如PostgreSQL文档所述(II. PostgreSQL客户端应用程序 - psql),您可以通过开关-cpsql(PostgreSQL交互终端)传递命令。您的选项是:

1、客户端CSV:\copy元命令

执行SQLCOPY命令,但是文件在客户端上读取,内容流向服务器。

psql -c "\copy tbname FROM '/tmp/the_file.csv' delimiter '|' csv"

(最初在此答案中提到的客户端选项)

2. 服务器端CSV:SQL COPY命令

在服务器上读取文件(当前用户需要具备必要的权限):

psql -c "COPY tbname FROM '/tmp/the_file.csv' delimiter '|' csv;"

读取服务器上文件所需的数据库角色:

COPY命名文件或命令仅允许数据库超级用户或被授予以下默认角色之一的用户pg_read_server_filespg_write_server_filespg_execute_server_program

此外,PostgreSQL服务器进程需要访问文件。

0
0 Comments

接受的解决方案仅适用于服务器端,并且执行查询的用户拥有按照这个SO答案所述读取文件的权限。

否则,更灵活的方法是将SQL的COPY命令替换为\copy元命令使用相同的选项与“真正”的COPY一样,但在客户端内运行(不需要在结尾处使用;):

psql -c "\copy tbname FROM '/tmp/the_file.csv' delimiter '|' csv"

根据文档\copy命令:

进行前端(客户端)复制。这是运行SQL COPY命令的操作,但是不是服务器读取或写入指定文件,而是psql读取或写入文件并在服务器和本地文件系统之间路由数据。这意味着文件可访问性和权限归本地用户所有,而不是服务器,不需要SQL超级用户权限。


此外,如果the_file.csv在第一行包含标题,可以通过在上述命令末尾添加header来识别:

psql -c "\copy tbname FROM '/tmp/the_file.csv' delimiter '|' csv header"

0