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

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


当前回答

我假设存在一些内部的psql命令,但你也可以从util-linux-ng包中运行脚本命令:

描述 脚本使打印在终端上的所有内容的typescript。

其他回答

从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

我假设存在一些内部的psql命令,但你也可以从util-linux-ng包中运行脚本命令:

描述 脚本使打印在终端上的所有内容的typescript。

如果你得到以下错误

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

这种方法适用于从最简单到最复杂的任何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

查看/跟踪您的命令输出

猫 SQLOP

完成了!谢谢!= D

COPY tablename TO '/tmp/output.csv' DELIMITER ',' CSV HEADER;

该命令用于将整个表存储为CSV格式