Linux 从命令行导入PostgreSQL CSV

Linux 从命令行导入PostgreSQL CSV,linux,database,postgresql,shell,import,Linux,Database,Postgresql,Shell,Import,我一直在使用PSQLPostgres终端使用以下命令将CSV文件导入到表中 COPY tbname FROM '/tmp/the_file.csv' delimiter '|' csv; 除了我必须登录到psql终端才能运行它之外,它工作得很好 我想知道是否有人知道从Linuxshell命令行执行类似命令的方法,类似于Postgres如何允许像bellow这样的shell命令 /opt/postgresql/bin/pg_dump dbname > /tmp/dbname.sql 这允

我一直在使用PSQLPostgres终端使用以下命令将CSV文件导入到表中

COPY tbname FROM
'/tmp/the_file.csv'
delimiter '|' csv;
除了我必须登录到psql终端才能运行它之外,它工作得很好

我想知道是否有人知道从Linuxshell命令行执行类似命令的方法,类似于Postgres如何允许像bellow这样的shell命令

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

这允许在不登录psql终端的情况下从Linux shell转储数据库。

如PostgreSQL文档()中所述,您可以使用开关
-c
将命令传递到
psql
(PostgreSQL交互终端)。您的选择是:

1、客户端CSV:meta命令 执行SQL命令,但会在客户端读取文件,并将内容路由到服务器

psql -c "\copy tbname FROM '/tmp/the_file.csv' delimiter '|' csv"
(中最初提到的客户端选项)

2.服务器端CSV:SQL命令 读取服务器上的文件(当前用户需要具有必要的权限):

在服务器上读取文件所需的DB角色:

COPY
仅允许数据库超级用户命名文件或命令 或被授予其中一个默认角色的用户
pg\u读取服务器文件
pg\u写入服务器文件
,或
pg\u执行服务器程序


PostgreSQL server进程还需要访问该文件。

最灵活的方法是在此处使用shell
文档,它允许您在查询中使用shell变量,甚至在(双引号或单引号)内:

#/垃圾箱/垃圾箱
_USER=moi
_DB=stuff
_表=人员
PSQL=/opt/postgresql/bin/PSQL
_DIR=/tmp
_文件=_文件.csv
${PSQL}-U${THE_USER}${THE_DB}要完成前面的内容,我建议:

psql -d your_dbname --user=db_username -c "COPY tbname FROM '/tmp/the_file.csv' delimiter '|' csv;"

接受答案中的解决方案将仅在服务器上工作,并且当执行查询的用户具有读取文件的权限时,如中所述

否则,更灵活的方法是用以下命令替换SQL的
COPY
命令(不需要
):

,使用
\copy
命令:

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


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

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

这是最好的答案,因为生产数据库肯定不允许用户在本地登录和执行,在数据库上公开文件系统共享也是一个坏主意。当文件位于可从数据库和用户访问的网络共享上时,可以安全地考虑复制。在大多数情况下,此\复制是一种更好的方法。谢谢
psql -d your_dbname --user=db_username -c "COPY tbname FROM '/tmp/the_file.csv' delimiter '|' csv;"
psql -c "\copy tbname FROM '/tmp/the_file.csv' delimiter '|' csv"
psql -c "\copy tbname FROM '/tmp/the_file.csv' delimiter '|' csv header"