从命令行导入PostgreSQL CSV

我一直在使用psql Postgresterminal来导入CSV文件到表中使用以下

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

这工作正常,但我必须login到psqlterminal来运行它。

我想知道是否有人知道如何从Linux shell命令行中执行与此类似的命令,类似于Postgres如何允许shell命令

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

这允许从Linux shell转储数据库而不login到psqlterminal。

如PostgreSQL文档( II。PostgreSQL客户端应用程序 – psql )中所述,您可以使用switch -c命令将命令传递给psql

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

接受的答案中的解决方案将只在服务器上工作,当执行该查询的用户将有权限读取该文件的解释在这个答案 。

否则,一个更灵活的方法是用psql的“meta-command”替换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" 

最灵活的方法是使用一个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 your_dbname --user=db_username -c "COPY tbname FROM '/tmp/the_file.csv' delimiter '|' csv;"