PostgreSQL: как передать параметры из командной строки? - PullRequest
73 голосов
/ 12 сентября 2011

У меня есть несколько подробный запрос в скрипте, который использует ? заполнители.Я хотел протестировать этот же запрос непосредственно из командной строки psql (вне скрипта).Я хочу не входить и не заменять все ? действительными значениями, вместо этого я хотел бы передать аргументы после запроса.

Пример:

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

Искать что-токак:

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

Ответы [ 5 ]

147 голосов
/ 12 сентября 2011

Вы можете использовать конструкцию -v, например,

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

, а затем ссылаться на переменные в sql как: v1,: v2 и т. Д.

select * from table_1 where id = :v1;

Обратите внимание, как мыпередать значение строки / даты, используя две кавычки " '...' "

26 голосов
/ 12 сентября 2011

Обнаруженный в 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;
11 голосов
/ 12 сентября 2011

В psql есть механизм с помощью команды

\set name val

, который должен быть привязан к параметру командной строки -v name=val.Цитировать это больно, в большинстве случаев проще поместить весь запрос в оболочку здесь-документа.

Редактировать

упс, мне следовало бы сказать -v вместо -P(что касается параметров форматирования) предыдущий ответ понял все правильно.

6 голосов
/ 26 апреля 2012

Вы также можете передать параметры в командной строке psql или из пакетного файла.Первые операторы собирают необходимые детали для подключения к вашей базе данных.

В последнем запросе запрашиваются значения ограничений, которые будут использоваться в предложении WHERE column 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 добавьте маркер v1 в предложении WHERE или в любом другом месте SQL.Обратите внимание, что токены также можно использовать в открытом операторе SQL, а не только в файле.Сохраните его как test.sql:

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

В Windows сохраните весь файл как файл DOS BATch (.bat), сохраните test.sql в том же каталоге и запустите пакетный файл.

Спасибо Дейву Пейджу из EnterpriseDB за оригинальный сценарий с подсказкой.

2 голосов
/ 12 сентября 2011

Может показаться, что то, что вы спрашиваете , не может быть сделано напрямую из командной строки . Вам придется либо использовать пользовательскую функцию в plpgsql, либо вызвать запрос из языка сценариев (и последний подход немного облегчает обход SQL-инъекций).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...