Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql psql-将命令的结果保存到文件中_Postgresql_Psql - Fatal编程技术网

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

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

我正在使用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

我假设存在一些用于此的内部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