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' };
Ответы
Ответ 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.
Ответ 5
Похоже, что то, что вы просите не может быть выполнено непосредственно из командной строки. Вам нужно либо использовать определенную пользователем функцию в plpgsql, либо вызвать запрос с языка сценариев (и последний подход облегчает SQL-инъекцию).
Ответ 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}"