如何将 psql 输出保存到文件?

问题描述 投票:0回答:10

我正在使用 psql 的

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

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

postgresql psql
10个回答
712
投票

来自 psql 的帮助 (

\?
):

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

命令序列如下所示:

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

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

然后任何数据库操作输出都将写入out.txt。 输入“\o”将输出恢复到控制台。

db=>\o

131
投票

jhwist 已经描述了 psql

\o
命令。

另一种方法是使用

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

注意!这需要

superuser
pg_write_server_files
权限,并将写入服务器上的文件

示例:

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

使用“;”创建 CSV 文件作为字段分隔符。

一如既往,有关详细信息,请参阅文档


70
投票

使用pgsql命令的o参数。

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

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

40
投票

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

28
投票

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

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

示例

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

8
投票

如果您遇到以下错误

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

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

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


1
投票

我假设存在一些内部 psql 命令,但您也可以运行

util-linux-ng
包中的 script 命令:

描述 脚本将终端上打印的所有内容制作为打字稿。


1
投票

docker 的方法

通过 psql 命令

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

或从sql文件查询

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

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

© www.soinside.com 2019 - 2024. All rights reserved.