Postgresql psql-将命令的结果保存到文件中
我正在使用psql的\dt列出数据库中的所有表,我需要保存结果 将psql命令的结果导出到文件的语法是什么?来自psql的帮助\?: \o[FILE]将所有查询结果发送到FILE或| pipe 命令的顺序如下所示:Postgresql psql-将命令的结果保存到文件中,postgresql,psql,Postgresql,Psql,我正在使用psql的\dt列出数据库中的所有表,我需要保存结果 将psql命令的结果导出到文件的语法是什么?来自psql的帮助\?: \o[FILE]将所有查询结果发送到FILE或| pipe 命令的顺序如下所示: [wist@scifres ~]$ psql db Welcome to psql 8.3.6, the PostgreSQL interactive terminal db=>\o out.txt db=>\dt db=>\q 我假设存在一些用于此的内部psq
[wist@scifres ~]$ psql db
Welcome to psql 8.3.6, the PostgreSQL interactive terminal
db=>\o out.txt
db=>\dt
db=>\q
我假设存在一些用于此的内部psql命令,但您也可以从包中运行脚本命令: 描述 脚本生成打印在终端上的所有内容的打印脚本 jhwist已经描述了psql\o命令 另一种方法是使用COPY TO命令直接写入服务器上的文件。这样做的好处是,它以您选择的易于解析的格式转储,而不是psql的表格格式。使用“复制自”也很容易导入到另一个表/数据库 注意!这需要超级用户权限,并将写入服务器上的文件 示例:将SELECT foo,bar从baz复制到“/tmp/query.csv”格式的csv,分隔符“;” 创建带有“;”的CSV文件作为字段分隔符 与往常一样,postgres命令copy可用于任何用户。不知道它是否适用于\dt,但一般语法是从以下链接复制的 以上内容将选择查询的输出保存在csv文件中 编辑: 对于我的psql服务器,下面的命令起作用这是一个较旧的版本v8.5
如果出现以下错误,此命令用于将整个表存储为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命令,而不需要对原始命令进行任何更改或调整 注意:对于Linux服务器 将命令的内容保存到文件中 模型 范例
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
范例
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
查看/跟踪命令输出
cat sqlop
完成了!谢谢=D码头工人的方法
通过psql命令
docker exec -i %containerid% psql -U %user% -c '\dt' > tables.txt
或从sql文件查询
docker exec -i %containerid% psql -U %user% < file.sql > data.txt
我是在\dt之前调用它,还是组合调用它?请包括语法谢谢。再次键入\o将关闭它。遗憾的是,\?不转到文件:对于您的类型,Peru Persual permission denied表示尝试作为管理员运行psql,\o queries-output.txt将所有后续命令o/p重定向到名为queries-output.txt的文件,并在psql提示符上键入\o再次还原此重定向行为。另请参阅。非常方便,谢谢。但是“拷贝”在。。。“复制到…”不是必需的-事实上,在最近的版本中,它会导致命令失败。汤姆,我认为这是一个输入错误。用我安装的pgsql 8.5VER编辑了这篇文章,这是给那些试图在\copy之后粘贴多行语句并出现语法错误的人的一个简短提示,就像我刚才做的那样。您需要与\copy在同一行继续。是否有办法关闭\copy?我发现,如果我运行一个像您示例中那样的语句,然后运行,例如,select*from users;它会将结果附加到我指定的最新文件中,而不是输出到屏幕上。谢谢。在postgres中,最好将副本替换为\COPY,以避免数据库管理员的需要。在windows中,这将文件放在C:\tmpI agree@helvete中,这里介绍的方法为用户提供了更强大的能力,可以以更自定义的方式配置输出
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
docker exec -i %containerid% psql -U %user% -c '\dt' > tables.txt
docker exec -i %containerid% psql -U %user% < file.sql > data.txt