我一直在使用psql Postgres终端使用以下内容将CSV文件导入表格
COPY tbname FROM
'/tmp/the_file.csv'
delimiter '|' csv;
除了我必须登录到psql终端才能运行它之外,它的工作正常。
我想知道是否有人知道如何从Linux shell命令行执行类似于此命令的方法,类似于Postgres允许shell命令如bellow
/opt/postgresql/bin/pg_dump dbname > /tmp/dbname.sql
这允许从Linux shell转储数据库而无需登录到psql终端。
答案 0 :(得分:28)
如PostgreSQL文档(II. PostgreSQL Client Applications - psql)中所述,您可以使用开关psql
将命令传递给-c
:
psql -c "COPY tbname FROM '/tmp/the_file.csv' delimiter '|' csv;"
答案 1 :(得分:26)
接受答案中的解决方案仅适用于服务器,并且当执行查询的用户有权阅读文件时,如this SO answer中所述。
否则,更灵活的方法是将COPY
命令替换为psql
's "meta-command" called \copy
which takes all the same options as the "real" COPY, but is run inside the client(最后不需要;
):
psql -c "\copy tbname FROM '/tmp/the_file.csv' delimiter '|' csv"
As per docs,\copy
命令:
执行前端(客户端)副本。这是一个运行SQL COPY命令的操作,但不是服务器读取或写入指定的文件,psql读取或写入文件并在服务器和本地文件系统之间路由数据。这意味着文件可访问性和权限是本地用户的权限,而不是服务器,并且不需要SQL超级用户权限。
此外,如果the_file.csv
包含第一行中的标题,则可以通过在上述命令末尾添加header
来识别它:
psql -c "\copy tbname FROM '/tmp/the_file.csv' delimiter '|' csv header"
答案 2 :(得分:7)
最灵活的方法是使用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
答案 3 :(得分:5)
要完成之前的answer,我建议:
psql -d your_dbname --user=db_username -c "COPY tbname FROM '/tmp/the_file.csv' delimiter '|' csv;"