7

psqlには、名前付き引数を渡すための構造があります。

psql -v name='value'

これは、スクリプト内で参照できます。

SELECT :name;

結果が得られます

 ?column?
----------
 value
(1 row)

開発中は、データベースのコピーをかなり頻繁に削除して再作成する必要があるため、プロセスを自動化しようとしています。したがって、すべてのユーザーを強制的に切断してからデータベースを削除するクエリを実行する必要があります。ただし、これが動作するデータベースはさまざまであるため、データベース名は引数である必要があります。

問題は、ユーザーを切断するためのクエリには文字列(WHERE pg_stat_activity.datname = 'dbname')が必要であり、ドロップするクエリには引用符で囲まれていないトークン(DROP DATABASE IF EXISTS dbname)が必要なことです。(申し訳ありません。その種類のトークンを何と呼ぶか​​わかりません。)

DROPクエリで名前付き引数を引用符なしで正常に使用できますが、切断クエリで名前付き引数を引用符で囲むと、引数が展開されません。':name'つまり、文字列の代わりに文字列を取得します'value'

DROPクエリで、引用符で囲まれていない値を文字列に変換したり、文字列を引用符で囲まれていないトークンに変換したりする方法はありますか?切断クエリとDROPクエリを別々のスクリプトに入れ、引数を引用符付きで切断に、引用符なしでDROPに渡すことで回避できますが、実際には2つのステップであるため、同じスクリプトに含めることをお勧めします。単一のプロセスで。

4

1 に答える 1

12

使用する:

... WHERE pg_stat_activity.datname = :'name'

一重引用符の前のコロンの配置に注意してください。
マニュアル:

引用符で囲まれていないコロン ( ) の後に psql 変数名が続く場合は、以下のSQL 補間:で説明されているように、変数の値に置き換えられます。フォーム とそこに記述されているものも同様に機能します。:'variable_name':"variable_name"

と:

変数の値を SQL リテラルとして引用するには、コロンの後に単一引用符で囲んだ変数名を記述します。

于 2012-08-30T02:00:00.313 に答える