出力ストリームに通知を取得する方法は?


20

関数にデバッグメッセージがあります。それらのメッセージは

RAISE NOTICE 'Value of id : %', id;

ログファイルを設定します \o messages.txt

それから私は私がする必要があることをします \i process.sql

そして実行が終了したとき\o

問題は、messages.txtに通知によって生成されたメッセージがないことです。メッセージは画面に表示されますが、messages.txtに書き込みたい

どうすればそれができますか?

私は使用しようとしましたがRAISE LOG...、メッセージはログファイルに書き込まれます...それは私が望むものではありません。

回避策があります

plsql -f /path/to/process.sql > messages.txt 2>&1

しかし、\ oで指定されたファイルにメッセージがあるplsqlクライアントで\ iと\ oを使用する方法を知りたい

cygwin上の私のクライアントはpsql(PostgreSQL)8.2.11で、サーバーバージョンは9.0.7です


1
問題の原因ではありませんが、Pg 9.0に対してpsql 8.2を使用すると、すべてのシステムカタログスキーマの変更と新しいサーバー機能のために、あらゆる種類の悲しみが生じる可能性があります。奇妙なまたは予期しない問題が発生した場合は、psql 9.xを試してください。
クレイグリンガー

@CraigRinger問題は、cygwinのクライアントpsqlが利用できないことです。少なくとも前回、cygwinでクライアントをアップグレードしようとしました。\ d機能を使用することはできませんが、他のすべては問題ないようです。
リュックM

@CraigRingerクライアントがもうサポートされていないことを知りませんでした。ありがとう。
リュックM

私はそれを再確認しました。私 cygwinがサポートされていないと思っており、Cygwinを長い間使用している人はいませんでしたが、ビルドファームの CygwinでPostgreSQL 9.2ベータ版をビルドしているようです。brolgaを参照してください。動作するはずです。現在のPgが必要な場合は、おそらくソースからコンパイルする必要があります。メンテナンスされていないのはバイナリのCygwinパッケージだけです。将来の混乱を避けるために、そのコメントを削除します。
クレイグリンガー

ただし、疑問は残っています。なぜCygwinを使用するのpsqlですか?libpqCygwinで実行する必要がある非ポータブルソフトウェアがあるかどうかは理解できましたpsqlが、Windowsでネイティブに利用可能な場合、Cygwinで古代バージョンを実行することの魅力は何ですか?
クレイグリンガー

回答:


8

この回答が気に入らないのではないかと心配していますが、現時点では不可能です。psqlドキュメントから:

将来のクエリ結果をファイルfilenameに保存するか、将来の結果を別のUnixシェルにパイプしてコマンドを実行します。引数が指定されていない場合、クエリ出力は標準出力にリセットされます。

「クエリ結果」には、データベースサーバーから取得したすべてのテーブル、コマンド応答、通知、およびデータベースをクエリするさまざまなバックスラッシュコマンド(\ dなど)の出力が含まれますが、エラーメッセージは含まれません。

お気づきのように、psqlインタラクティブに使用する場合、エラーメッセージをリダイレクトする方法はありません。

(\ oから無用へのあらゆる種類のリダイレクトで遊んでいます。クエリ出力チャネルはエラーメッセージを取得するチャネルとは異なるようです。また、サーバーからのエラーやプロシージャで発生したエラーも異なる方法で処理されます。 。

test=# SHOW client_min_messages;
 client_min_messages
---------------------
 notice

-- added the above to show it's not a config problem

CREATE FUNCTION raise_test() RETURNS integer AS
$body$
BEGIN
    RAISE NOTICE 'notice';
    RETURN 1;
END;
$body$
LANGUAGE plpgsql;

test=# \o | cat > out.sql
test=# SELECT raise_test(); -- you could put this in a file and call \i your_file, it's just the same
NOTICE:  notice

test=# \o | cat > out.sql 2>&1
test=# SELECT raise_test();
NOTICE:  notice

out.sqlに含まれるもの

 raise_test
------------
          1
(1 row)

両方の場合において。これが、プロシージャから生成されたメッセージを出力するためにどのチャネル/ファイル記述子が使用されるかについて私が無知である理由です。)

(PostgreSQLハッカーには、この問題を明らかにするスレッドがあります:http : //postgresql.1045698.n5.nabble.com/psql-output-locations-td5068313.html

どのような1はおそらく開始されない可能性がpsql

psql test >/tmp/psql.out 2>&1

これにより、すべての出力が指定されたファイルにリダイレクトされます。これに関する唯一の問題は、プロンプトさえも持たず、コマンドライン編集機能を失うことです。


1
いいえ、あなたの答えは好きではありません。:
リュックM

チャネル/ファイル記述子は、プロシージャから発生したメッセージを出力するために使用されます。これは標準エラーです。\o | cat > out.sql 2>&1の標準エラーをリダイレクトしますがcat、のエラーはリダイレクトしpsqlないため、通知には役に立ちません。
ダニエルヴェリテ

@ dezso、pgAdminまたは他のGUIツールはどのようにNOTICE情報を表示しますか?
スパイク

@Spikeはの上に構築されないpsqlので、おそらく問題はありません。
dezso

@dezso、そうだね。セッション内で設定client_min_messagedebug、いくつかの動的SQLを(DO関数を作成せずに)実行すると、psqlではなくpgAdminで通知が発生するなどの問題が発生しました。ステートメントをclient_min_message実行する前に値DOを出力しました。が表示されますdebugが、メッセージはコンソールに印刷されていません。
スパイク

2

\!メタコマンドを使用してpsqlから直接シェルコマンドを実行できます。

localhost:5432 user @ db =#\!psql -U user -h localhost your_database -e 'select your_function_name()'> debug.txt 2>&1

開くdebug.txt\e

localhost:5432 user @ db =#\ e debug.txt

デフォルトのエディターにメッセージが表示されます。少しトリッキーですが、まだコマンドライン愛好家にとって非常に便利です。


0

元の質問に対する解決策ではなく、OPの回避策への追加(これは私にとっては機能しませんでした)


raiseTest.sqlとして以下を使用

BEGIN;

CREATE FUNCTION count_to_hundred() RETURNS VOID AS
$_$
BEGIN
    FOR i IN 1..100 
    LOOP
        RAISE NOTICE '%', i;
    END LOOP;

    RETURN;
END;
$_$
LANGUAGE plpgsql;


SELECT count_to_hundred();

ROLLBACK;



OPに記載されているようなファイルへの出力の書き込みが機能しないのは確かではありませんが、実際にTにパイピングするとうまくいきました:

psql -f raiseTest.sql 2>&1 | tee messages.txt


Teeは、stdinを1つ以上のファイルに書き込み、stdoutに戻します。そのため、コンソールと指定したファイルにすべてのRAISEステートメントがあります。(cf. teeのマニュアルページ


構成:

  • Postgres 8.4
  • Cygwin 2.0.2
  • ティー8.23

問題は、メッセージがで上げ得ることについてだったNOTICEあなたは、対話型セッションと利用されるようにしている間\o
リュックM

ああ、あなたはそこにいます。OPでの回避策がうまくいかず、これだけに集中したため、私はその部分を見逃しました。
父スタック
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.