psql-将命令结果保存到文件


Answers:


477

从psql的帮助(\?):

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

命令序列如下所示:

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

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

1
我在\ dt之前还是将其组合使用?请包括语法谢谢。
pstanton 2011年

117
\o再次键入将其关闭。
卡尔·G

3
遗憾的是,的输出\?不会转到文件中。:(
blitzen9872

对于您的永久许可,拒绝说尝试以管理员身份运行psql
Ajay Takur

1
是的,\o queries-output.txt将所有后续命令o / p重定向到名为file的文件,queries-output.txt然后键入\o(再次在psql提示符下)恢复此重定向行为。
hygull

95

\ojhwist已经描述了psql 命令。

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

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

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

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

与往常一样,请参阅文档以了解详细信息


我同意@helvete,此处介绍的方法为用户提供了更多以更自定义方式配置输出的功能
Nathan Benton,

27

\copy这是一个postgres命令,可以对任何用户起作用。不知道它是否适用于\ dt,但是通用语法是从以下链接中复制的:Postgres SQL复制语法

\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;

非常方便,谢谢。但是不需要“ ...复制到...”中的“复制”-实际上,在最新版本中,它会导致命令失败。
汤姆(Tom)

汤姆,我认为这是一个错字。使用适合我的安装pgsql 8.5ver的文章编辑了该帖子
Aakash Gupta,

谨向所有试图在\ copy之后粘贴多行语句并遇到令人困惑的语法错误的人提供快速提示,就像我刚才所做的那样。您需要与\ copy在同一行上继续。
谁问

有没有办法关闭\ copy?我发现如果我像您的示例中那样运行一条语句,然后再运行,例如,从用户中选择*;它将结果附加到我指定的最新文件中,而不是输出到屏幕上。谢谢。
raphael75

6

使用pgsql命令的o参数。

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

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

3

COPY tablename TO '/tmp/output.csv' DELIMITER ',' CSV HEADER; 此命令用于将整个表存储为csv


在postgres中,最好将\ COPY替换为COPY以避免需要db admin。在windows这使得在文件C:\ tmp目录

3

如果出现以下错误 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


2

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

\复制(您的查询)到“文件路径” csv标头中;

\ copy(从purchase_order中选择名称,date_order)复制到'/home/ankit/Desktop/result.csv'cvs标头;

希望这对您有所帮助。


1

我假设为此存在一些内部psql命令,但是您也可以scriptutil-linux-ng包中运行该命令:

描述脚本对终端上打印的所有内容进行打字。


0

从最简单到最复杂的任何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)" >>sqlop 2>&1

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

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

cat sqlop

做完了!谢谢!= D


0

码头工人的方法

通过psql命令

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

或从sql文件查询

docker exec -i %containerid% psql -U %user% < file.sql > data.txt
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.