【问题标题】:psql - save results of command to a filepsql - 将命令结果保存到文件中
【发布时间】:2011-07-16 22:09:00
【问题描述】:

我正在使用 psql 的 \dt 列出数据库中的所有表,我需要保存结果。

将 psql 命令的结果导出到文件的语法是什么?

【问题讨论】:

标签: postgresql psql


【解决方案1】:

来自 psql 的帮助 (\?):

\o [FILE] 将所有查询结果发送到文件或|管道

命令序列如下所示:

[wist@scifres ~]$ psql db
Welcome to psql 8.3.6, the PostgreSQL interactive terminal

db=>\o out.txt
db=>\dt

然后任何db操作输出都会写入out.txt。 输入 '\o' 将输出恢复到控制台。

db=>\o

【讨论】:

  • 我是在 \dt 之前调用它,还是同时调用它?请包括语法谢谢。
  • 再次输入 \o 将其关闭。
  • 遗憾的是,\? 的输出没有进入文件。 :(
  • 为了您的仔细阅读权限被拒绝说尝试以管理员身份运行 psql
  • 是的,\o queries-output.txt 将所有后续命令 o/p 重定向到名为 queries-output.txt 的文件并键入 \o(再次在 psql 提示符下)恢复此重定向行为。
【解决方案2】:

jhwist 已经描述了 psql \o 命令。

另一种方法是使用COPY TO 命令直接写入服务器上的文件。这样做的好处是它以您选择的易于解析的格式转储 - 而不是 psql 的表格格式。使用COPY FROM 导入到另一个表/数据库也很容易。

注意!这需要超级用户权限,并将写入服务器上的文件

示例:COPY (SELECT foo, bar FROM baz) TO '/tmp/query.csv' (format csv, delimiter ';')

使用 ';' 创建一个 CSV 文件作为字段分隔符。

一如既往,see the documentation for details

【讨论】:

  • 我同意@helvete,这里介绍的方法为用户提供了更多的能力来以更自定义的方式配置输出
【解决方案3】:

\copy 这是一个 postgres 命令,适用于任何用户。不知道它是否适用于\dt,但一般语法转载自以下链接Postgres SQL copy syntax

\copy (select * from tempTable limit 100) to 'filenameinquotes' with header delimiter as ','

以上将选择查询的输出保存在作为csv文件提供的文件名中

编辑:

对于我的 psql 服务器,以下命令有效这是旧版本 v8.5

copy (select * from table1) to 'full_path_filename' csv header;

【讨论】:

  • 非常方便,谢谢。但是'...复制到...'中的'复制'不是必需的-实际上在最近的版本中它会导致命令失败。
  • 汤姆,我认为这是一个错字。使用适用于我的安装 pgsql 8.5ver 的帖子编辑帖子
  • 只是给任何试图在 \copy 之后粘贴多行语句并遇到令人困惑的语法错误的人的快速说明,就像我刚才所做的那样。您需要在 \copy 所在的同一行继续。
  • 有没有办法关闭\copy?我发现如果我像你的例子那样运行一个语句,然后我运行,例如,select * from users;它会将结果附加到我指定的最新文件中,而不是输出到屏幕上。谢谢。
【解决方案4】:

使用 pgsql 命令的 o 参数。

-o, --output=FILENAME 将查询结果发送到文件(或|管道)

psql -d DatabaseName -U UserName -c "SELECT * FROM TABLE" -o /root/Desktop/file.txt

【讨论】:

  • 谢谢,正在寻找可以从 CL 发送的版本。
【解决方案5】:

使用以下查询将结果存储在 CSV 文件中

\copy (your query) to 'file path' csv header;

例子

\copy (select name,date_order from purchase_order) to '/home/ankit/Desktop/result.csv' cvs header;

希望对你有所帮助。

【讨论】:

  • 谢谢。只是一句话:在你的例子的结尾是csv header
【解决方案6】:

如果出现以下错误

ufgtoolspg=> COPY (SELECT foo, bar FROM baz) TO '/tmp/query.csv' (format csv, delimiter ';');
ERROR:  must be superuser to COPY to or from a file
HINT:  Anyone can COPY to stdout or from stdin. psql's \copy command also works for anyone.

你可以这样运行它:

psql somepsqllink_or_credentials -c "COPY (SELECT foo, bar FROM baz) TO STDOUT (format csv, delimiter ';')"  > baz.csv

【讨论】:

    【解决方案7】:
    COPY tablename TO '/tmp/output.csv' DELIMITER ',' CSV HEADER;
    

    此命令用于将整个表存储为 csv

    【讨论】:

    • 在 postgres 中,COPY 最好替换为 \COPY 以避免需要数据库管理员。在 Windows 中,这会将文件放在 C:\tmp
    【解决方案8】:

    我假设存在一些内部 psql 命令,但您也可以从 util-linux-ng 包运行 script 命令:

    描述 Script 为您终端上打印的所有内容制作打字稿。

    【讨论】:

      【解决方案9】:

      这种方法适用于从最简单到最复杂的任何 psql 命令,无需对原始命令进行任何更改或调整。

      注意:适用于 Linux 服务器。


      • 将命令内容保存到文件中

      型号

      read -r -d '' FILE_CONTENT << 'HEREDOC'
      [COMMAND_CONTENT]
      
      HEREDOC
      echo -n "$FILE_CONTENT" > sqlcmd
      

      示例

      read -r -d '' FILE_CONTENT << 'HEREDOC'
      DO $f$
      declare
          curid INT := 0;
          vdata BYTEA;
          badid VARCHAR;
          loc VARCHAR;
      begin
      FOR badid IN SELECT some_field FROM public.some_base LOOP
          begin
          select 'ctid - '||ctid||'pagenumber - '||(ctid::text::point) [0]::bigint
              into loc
              from public.some_base where some_field = badid;
              SELECT file||' '
              INTO vdata
              FROM public.some_base where some_field = badid;
          exception
              when others then
              raise notice 'Block/PageNumber - % ',loc;
                  raise notice 'Corrupted id - % ', badid;
                  --return;
          end;
      end loop;
      end;
      $f$;
      
      HEREDOC
      echo -n "$FILE_CONTENT" > sqlcmd
      
      • 运行命令

      型号

      sudo -u postgres psql [some_db] -c "$(cat sqlcmd)" &gt;&gt;sqlop 2&gt;&amp;1

      示例

      sudo -u postgres psql some_db -c "$(cat sqlcmd)" &gt;&gt;sqlop 2&gt;&amp;1

      • 查看/跟踪您的命令输出

      cat sqlop

      完成!谢谢! =D

      【讨论】:

        【解决方案10】:

        码头工人的方法

        通过 psql 命令

         docker exec -i %containerid% psql -U %user% -c '\dt' > tables.txt
        

        或从sql文件查询

        docker exec -i %containerid% psql -U %user% < file.sql > data.txt
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-04-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-08-07
          相关资源
          最近更新 更多