我一直在使用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;"