переданная переменная psql

Новичок в написании сценариев psql.
Я пытаюсь передать переменную в сценарий psql, но получаю сообщение об ошибке:

psql -v dateav="2012-01-28" mcdb -p 5555 -U admin -q -t -A -c 'select count (client_name) from v_activities where scheduled_start_date like :'dateav';'

ERROR:  syntax error at or near ":"
LINE 1: ...) from v_activities where scheduled_start_date like :dateav;

Любые идеи?


person user1854179    schedule 26.11.2012    source источник


Ответы (1)


Будет работать так:

echo "select count (client_name) from v_activities \
where scheduled_start_date like :'dateav'" | \
psql -v dateav="2012-01-28" mcdb -p 5555 -U admin -q -t -A

Объяснять:

Я цитирую руководство здесь:

-c команда

(...) команда должна быть либо командной строкой, полностью поддающейся анализу сервером (т. е. она не содержит не специфичных для psql функций)

Жирный акцент мой. Вы можете обойти это ограничение, передав команду конвейером вместо использования параметра -c.

echo 'command' | psql

Этот другой вызов немного дороже, но таким образом переменные psql заменяются так, как вы предполагали.

Обратная косая черта в конце предназначена только для продолжения строки. Ни один символ не может следовать в одной строке. Единственная цель - более приятный формат.


В этом простом случае вы можете просто заменить переменную перед вызовом psql:

psql mcdb -p 5555 -U admin -q -t -A \
     -c "select count (client_name) from v_activities \
         where scheduled_start_date like '2012-01-28'"

Я использую двойные кавычки в командной строке, чтобы получить одинарные кавычки. Вы также можете комбинировать долларовую котировку и одинарные кавычки:

-c 'select ... like $x$2012-01-28$x$'

Но у вас, вероятно, есть другие ограничения в вашем реальном приложении.

person Erwin Brandstetter    schedule 26.11.2012