web-dev-qa-db-ja.com

PostgreSQL:コマンドラインからパラメーターを渡す方法

?プレースホルダーを使用するスクリプトには、多少詳細なクエリがあります。この同じクエリをpsqlコマンドライン(スクリプトの外部)から直接テストしたかったのです。すべての?を実際の値で置き換えないようにしたいので、代わりにクエリの後に引数を渡したいです。

例:

SELECT  * 
FROM    foobar
WHERE   foo = ?
   AND  bar = ?
    OR  baz = ?  ;

次のようなものを探しています:

%> {select * from foobar where foo=? and bar=? or baz=? , 'foo','bar','baz' };
75
vol7ron

-v構文を使用できます(例:

psql -v v1=12  -v v2="'Hello World'" -v v3="'2010-11-12'"

そして、sqlの変数を:v1、:v2などとして参照します

select * from table_1 where id = :v1;

2つの引用符を使用して文字列/日付値を渡す方法に注意してください" '...' "

151
Gavin

PostgreSQLで発見された PREPAREステートメント は、スクリプト言語でできるようにできます。残念ながら、?はまだ使用できませんが、$n表記は使用できます。

上記の例を使用して:

PREPARE foo(text,text,text) AS
    SELECT  * 
    FROM    foobar
    WHERE   foo = $1
       AND  bar = $2
        OR  baz = $3  ;
EXECUTE foo('foo','bar','baz');
DEALLOCATE foo;
27
vol7ron

Psqlには、

\set name val

-v name=valコマンドラインオプションに関連付けられることになっているコマンド。引用は苦痛です。ほとんどの場合、クエリ全体をシェルのヒアドキュメントに入れる方が簡単です。

編集

おっと、私は-v(フォーマットオプション用)の代わりに-Pと言っておくべきだった。

11
wildplasser

Psqlコマンドラインまたはバッチファイルからパラメーターを渡すこともできます。最初のステートメントは、データベースに接続するために必要な詳細を収集します。

最後のプロンプトは、WHERE列のIN()句で使用される制約値を要求します。文字列の場合は単一引用符で、コンマで区切ることを忘れないでください:

@echo off
echo "Test for Passing Params to PGSQL"
SET server=localhost
SET /P server="Server [%server%]: "

SET database=amedatamodel
SET /P database="Database [%database%]: "

SET port=5432
SET /P port="Port [%port%]: "

SET username=postgres
SET /P username="Username [%username%]: "

SET /P bunos="Enter multiple constraint values for IN clause [%constraints%]: "
ECHO you typed %constraints%
PAUSE
REM pause
"C:\Program Files\PostgreSQL\9.0\bin\psql.exe" -h %server% -U %username% -d %database% -p %port% -e -v v1=%constraints% -f test.sql

ここで、SQLコードファイルで、WHERE句内、またはSQLの任意の場所にv1トークンを追加します。トークンは、ファイルだけでなく、開いているSQLステートメントでも使用できることに注意してください。これをtest.sqlとして保存します。

SELECT * FROM myTable
WHERE NOT someColumn IN (:v1);

Windowsでは、ファイル全体をDOS BATchファイル(.bat)として保存し、test.sqlを同じディレクトリに保存して、バッチファイルを起動します。

EnterpriseDBのDave Pageに、元のプロンプトスクリプトをありがとう。

6
MAbraham1

あなたが尋ねることは、 コマンドラインから直接行うことはできません と思われます。 plpgsqlでユーザー定義関数を使用するか、スクリプト言語からクエリを呼び出す必要があります(後者のアプローチにより、SQLインジェクションを回避するのが少し簡単になります)。

2
user554546