psql-コマンドの結果をファイルに保存する


回答:


478

psqlのヘルプ(\?)から:

\ o [ファイル]すべてのクエリ結果をファイルまたはパイプに送信します。

コマンドのシーケンスは次のようになります。

[wist@scifres ~]$ psql db
Welcome to psql 8.3.6, the PostgreSQL interactive terminal

db=>\o out.txt
db=>\dt
db=>\q

1
これを\ dtの前に呼び出すか、組み合わせて呼び出すか 構文の感謝を含めてください。
pstanton 2011年

118
\oもう一度入力するとオフになります。
Carl G

3
悲しいことに、の出力は\?ファイルに行きません。:(
blitzen9872 2017

あなたの親切な閲覧許可が拒否されたため、psqlを管理者として実行してみてください
Ajay

1
はい、\o queries-output.txt後続のすべてのコマンドo / pを指定されたファイルにリダイレクトし、(psqlプロンプトで)queries-output.txt入力すると、このリダイレクト動作が元に戻ります。\o
hygull

95

psql \oコマンドは、jhwistによってすでに記述されています。

別の方法は、COPY TOコマンドを使用してサーバー上のファイルに直接書き込むことです。これには、psqlの表形式ではなく、選択した解析しやすい形式でダンプされるという利点があります。を使用して別のテーブル/データベースにインポートすることも非常に簡単COPY FROMです。

NB!これにはスーパーユーザー権限が必要で、サーバー上のファイル書き込みます

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

「;」でCSVファイルを作成します フィールドセパレータとして。

いつものように、詳細についてはドキュメントを参照してください


@helveteに同意します。ここで紹介するアプローチにより、ユーザーはよりカスタマイズされた方法で出力を構成することができます
Nathan Benton

27

\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 to ...」の「copy」は必要ありません。実際、最近のバージョンでは、コマンドが失敗します。
トム

トム、それはタイプミスだったと思う。私のインストールpgsql 8.5verで動作する投稿で投稿を編集しました
Aakash Gupta

私がしたように、\ copyの後に複数行のステートメントを貼り付けようとすると、構文エラーがわかりにくくなるので、注意してください。\ copyと同じ行を続ける必要があります。
18年

\ copyをオフにする方法はありますか?私はあなたの例のようにステートメントを実行してから、たとえば実行すると、select * from users; 画面に出力するのではなく、指定した最新のファイルに結果を追加します。ありがとうございました。
raphael75

6

pgsqlコマンドのoパラメータを使用します。

-o、--output = FILENAMEクエリ結果をファイル(または|パイプ)に送信します

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

3

COPY tablename TO '/tmp/output.csv' DELIMITER ',' CSV HEADER; このコマンドは、テーブル全体をcsvとして保存するために使用されます


postgresでは、COPYの代わりに\ COPYを使用することで、db adminの必要性を回避できます。Windowsでは、これはファイルをC:\ tmpに配置します
Jan

3

次のエラーが発生した場合 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


2

以下のクエリを使用して結果をcsvファイルに保存します

\ copy(クエリ)から 'ファイルパス'のcsvヘッダー。

\ copy(名前を選択、purchase_orderからdate_order)を '/home/ankit/Desktop/result.csv' cvsヘッダーに;

これがお役に立てば幸いです。


1

これにはいくつかの内部psqlコマンドが存在すると想定していますがscriptutil-linux-ngパッケージからコマンドを実行することもできます。

スクリプトは、端末に出力されるすべてのタイプスクリプトを作成します。


0

このアプローチ、元のコマンドに変更や調整を加えることなく、最も単純なものから最も複雑なものまで、あらゆる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


0

ドッカーへのアプローチ

psqlコマンド経由

 docker exec -i %containerid% psql -U %user% -c '\dt' > tables.txt

またはSQLファイルからクエリ

docker exec -i %containerid% psql -U %user% < file.sql > data.txt
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.