私はbashシェルから起動され、次の(マッサージ)psqlのスクリプトがあります。psqlクエリからstdoutにテキストを出力するにはどうしたらいいですか?
foo=$(psql -q -t -R $'\x01' -F $'\x02' \
--variable="title=something" \
--variable="severity=level9" \
--pset='format=unaligned' \
<<'EOF'
SET standard_conforming_strings=on;
SET myvars.title = :title;
SET myvars.severity = :severity;
DO $$
BEGIN
IF EXISTS (SELECT 1 from my_database
WHERE title=current_setting('myvars.title') \
AND severity=current_setting('myvars.severity'))
THEN
RAISE NOTICE 'Found existing entry';
ELSE
RAISE NOTICE 'Did not find existing entry';
END IF;
END;
$$;
EOF
)
私はbashの変数「foo」というクエリが成功したかどうかのいくつかの兆候でキャプチャすることを望んでいました。どのRAISE NOTICEステートメントの後にも、psql
ステートメントから0または1を出力するような印刷/エコー/リターン/何らかのステートメントを追加できると思ったので、後でbashスクリプトで評価するためにfoo
にキャプチャできます。
foo=$(psql -q -t -R $'\x01' -F $'\x02' \
--variable="title=something" \
--variable="severity=level9" \
--pset='format=unaligned' \
<<'EOF'
SET standard_conforming_strings=on;
SET myvars.title = :title;
SET myvars.severity = :severity;
DO $$
BEGIN
IF EXISTS (SELECT 1 from my_database
WHERE title=current_setting('myvars.title') \
AND severity=current_setting('myvars.severity'))
THEN
RAISE NOTICE 'Found existing entry';
magical_incantation 1;
ELSE
RAISE NOTICE 'Did not find existing entry';
magical_incantation 0;
END IF;
END;
$$;
EOF
)
私は過去5時間程度のためpsql
ドキュメントを読んでいると、上記の私の想像magical_incantation
のコマンド/構文を把握することはできません。
私はpsqlには新しく、他の人のコードを調整しています。私はスクリプトの主な構造を変更することはできません、私はちょうど値を印刷するためのいくつかの方法が必要です。
誰でも正しい方向に向けることができますか?
私は '\ echo '1';'(引用符をつけたものとしないもの)を試してみたところ、 '\'に構文エラーがありました。私はpsqlコマンドの最後に '2>&1'を追加しようとしましたが、RAISE NOTICEの出力をキャプチャしませんでした(これは正しい方法ではないようです)。私はどのように変数にクエリ結果をキャプチャするかを理解することができませんでしたが、私はまだ変数の内容を印刷する方法を見つけることができませんでした。私は幸運を伴わずに「SELECT ...」の様々なフレーバーを試しました。もし私があなたが示唆したようにしたら、私はどのようにRAISE NOTICEを組み込むのか分かりません。しかし、ありがとう。 –
\ echoは* psql *コマンドであり、postgresqlコマンドではありません(フロントエンドで、バックエンドではありません)。告発はあなたが望むものではありません。両方を実行する場合は、実際の関数を定義し、そこから選択します。 psqlから直接psql標準出力に書き込むことはできません。結果を選択できるようなもの、つまり関数が必要です。 –
私はちょうど選択コマンド 'SELECT 1 from my_database WHERE title = current_setting( 'myvars.title')とseverity = current_setting( 'myvars.severity')で' DO $$ 'から' $$; 'までのすべてを置き換えました。それはうまくいきましたが、もちろん私はRAISE NOTICEをあきらめなければなりませんでした。ある日、私は座って本当にこのコマンド/言語を学ばなければならないでしょうが、今は私が進める必要があるものを持っています - あなたの助けに感謝します。 –