回答:
psqlのヘルプ(\?
)から:
\ o [ファイル]すべてのクエリ結果をファイルまたはパイプに送信します。
コマンドのシーケンスは次のようになります。
[wist@scifres ~]$ psql db
Welcome to psql 8.3.6, the PostgreSQL interactive terminal
db=>\o out.txt
db=>\dt
db=>\q
\o
もう一度入力するとオフになります。
\?
ファイルに行きません。:(
\o queries-output.txt
後続のすべてのコマンドo / pを指定されたファイルにリダイレクトし、(psqlプロンプトで)queries-output.txt
入力すると、このリダイレクト動作が元に戻ります。\o
psql \o
コマンドは、jhwistによってすでに記述されています。
別の方法は、COPY TO
コマンドを使用してサーバー上のファイルに直接書き込むことです。これには、psqlの表形式ではなく、選択した解析しやすい形式でダンプされるという利点があります。を使用して別のテーブル/データベースにインポートすることも非常に簡単COPY FROM
です。
NB!これにはスーパーユーザー権限が必要で、サーバー上のファイルに書き込みます。
例: 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;
次のエラーが発生した場合
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(クエリ)から 'ファイルパス'のcsvヘッダー。
例
\ copy(名前を選択、purchase_orderからdate_order)を '/home/ankit/Desktop/result.csv' cvsヘッダーに;
これがお役に立てば幸いです。
これにはいくつかの内部psqlコマンドが存在すると想定していますがscript
、util-linux-ngパッケージからコマンドを実行することもできます。
スクリプトは、端末に出力されるすべてのタイプスクリプトを作成します。
このアプローチは、元のコマンドに変更や調整を加えることなく、最も単純なものから最も複雑なものまで、あらゆる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