【问题标题】:PostgreSQL CSV import from command line从命令行导入 PostgreSQL CSV
【发布时间】:2015-04-20 13:51:48
【问题描述】:

我一直在使用 psql Postgres 终端使用以下方法将 CSV 文件导入表中

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

除了我必须登录到 psql 终端才能运行它之外,它工作正常。

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

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

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

【问题讨论】:

    标签: linux database postgresql shell import


    【解决方案1】:

    接受答案中的解决方案仅适用于服务器,并且当执行查询的用户将有权读取文件时,如this SO answer 中所述。

    否则,更灵活的方法是将SQL的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,可以通过在上述命令末尾添加header来识别:

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

    【讨论】:

    • 这是最好的答案,因为生产数据库当然不允许用户在本地登录和执行,并且在数据库上公开文件系统共享也是一个坏主意。当文件位于可从数据库和用户访问的网络共享上时,可以安全地考虑 COPY。在大多数情况下,此 \copy 是更好的方法。谢谢!
    【解决方案2】:

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

    1、客户端CSV:\copy元命令

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

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

    this answer中最初提到的客户端选项)

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

    【讨论】:

      【解决方案3】:

      要完成之前的answer,我建议:

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

      【讨论】:

        【解决方案4】:

        最灵活的方法是使用 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
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-04-21
          • 2011-09-30
          • 2016-06-24
          • 2018-07-31
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多