Подтвердить что ты не робот

PostgreSQL: как передать параметры из командной строки?

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

Пример:

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

Ищете что-то вроде:

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

Ответ 1

Вы можете использовать конструкцию -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

Обнаруженный в 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;

Ответ 3

В psql существует механизм через

\set name val

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

Изменить

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

Ответ 4

Вы также можете передавать параметры в командной строке 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 в том же каталоге и запустите пакетный файл.

Спасибо за Dave Page, EnterpriseDB, за исходный запрос script.

Ответ 6

Сначала вы можете построить строку запроса, используя переменные ОС, а затем передать ее в PSQL следующим образом:

FOO=FOOVALUE
BAR=BARVALUE
BAZ=BAZVALUE

Q1="select * from foobar where foo=${FOOVALUE} and bar=${BARVALUE} or baz=${BAZVALUE};"

PSQL [your connection parameters] -c "${Q1}"