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つのステップであるため、同じスクリプトに含めることをお勧めします。単一のプロセスで。