PostgreSQL CSV从命令行导入



我一直在使用psqlPostgres终端,使用以下将CSV文件导入表中

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

它工作得很好,只是我必须登录到psql终端才能运行它

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

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

这允许从Linux外壳转储数据库,而无需登录到psql终端。

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

否则,一种更灵活的方法是将SQL的COPY命令替换为psql的名为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"

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

1、客户端CSV:copy元命令

执行SQL COPY命令,但在客户端上读取文件并将内容路由到服务器。

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服务器进程也需要访问该文件。

要完成前面的答案,我建议:

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

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

#!/bin/sh
THE_USER=moi
THE_DB=stuff
THE_TABLE=personnel
PSQL=/opt/postgresql/bin/psql
THE_DIR=/tmp
THE_FILE=the_file.csv
${PSQL} -U ${THE_USER} ${THE_DB} <<OMG
COPY ${THE_TABLE} FROM '${THE_DIR}/${THE_FILE}' delimiter '|' csv;
OMG

您可以尝试以下操作:

psql -d mydatabase -c "copy mytable from 'filename.csv' with (format csv, header true)"

不要忘记,您需要从文件所在的位置运行该命令。

相关内容

  • 没有找到相关文章

最新更新