PSQL -保存命令的结果到一个文件

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

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

355239 次浏览

从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包中运行script命令:

< p >描述

. Script为打印在终端上的所有内容生成typescript

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

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

NB !这需要superuserpg_write_server_files权限,并将写入文件在服务器上

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

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

像往常一样,详细信息请参见文档

\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;
COPY tablename TO '/tmp/output.csv' DELIMITER ',' CSV HEADER;

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

如果你得到以下错误

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

使用下面的查询将结果存储在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;

希望这对你有所帮助。

使用pgsql命令的o参数。

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

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

这种方法将工作与任何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

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