【发布时间】:2011-07-16 22:09:00
【问题描述】:
我正在使用 psql 的 \dt 列出数据库中的所有表,我需要保存结果。
将 psql 命令的结果导出到文件的语法是什么?
【问题讨论】:
标签: postgresql psql
我正在使用 psql 的 \dt 列出数据库中的所有表,我需要保存结果。
将 psql 命令的结果导出到文件的语法是什么?
【问题讨论】:
标签: postgresql psql
来自 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
【讨论】:
\o 将其关闭。
\? 的输出没有进入文件。 :(
\o queries-output.txt 将所有后续命令 o/p 重定向到名为 queries-output.txt 的文件并键入 \o(再次在 psql 提示符下)恢复此重定向行为。
jhwist 已经描述了 psql \o 命令。
另一种方法是使用COPY TO 命令直接写入服务器上的文件。这样做的好处是它以您选择的易于解析的格式转储 - 而不是 psql 的表格格式。使用COPY FROM 导入到另一个表/数据库也很容易。
注意!这需要超级用户权限,并将写入服务器上的文件。
示例:COPY (SELECT foo, bar FROM baz) TO '/tmp/query.csv' (format csv, delimiter ';')
使用 ';' 创建一个 CSV 文件作为字段分隔符。
【讨论】:
\copy 这是一个 postgres 命令,适用于任何用户。不知道它是否适用于\dt,但一般语法转载自以下链接Postgres SQL copy syntax
\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;
【讨论】:
使用 pgsql 命令的 o 参数。
-o, --output=FILENAME 将查询结果发送到文件(或|管道)
psql -d DatabaseName -U UserName -c "SELECT * FROM TABLE" -o /root/Desktop/file.txt
【讨论】:
使用以下查询将结果存储在 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;
希望对你有所帮助。
【讨论】:
csv header
如果出现以下错误
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
【讨论】:
COPY tablename TO '/tmp/output.csv' DELIMITER ',' CSV HEADER;
此命令用于将整个表存储为 csv
【讨论】:
我假设存在一些内部 psql 命令,但您也可以从 util-linux-ng 包运行 script 命令:
描述 Script 为您终端上打印的所有内容制作打字稿。
【讨论】:
这种方法适用于从最简单到最复杂的任何 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
【讨论】:
码头工人的方法
通过 psql 命令
docker exec -i %containerid% psql -U %user% -c '\dt' > tables.txt
或从sql文件查询
docker exec -i %containerid% psql -U %user% < file.sql > data.txt
【讨论】: