Задний план
Цель состоит в том, чтобы создать базу данных и пользователя при запуске, если они не существуют. Используя обходной путь bash, описанный здесь: Имитация CREATE DATABASE IF NOT EXISTS для PostgreSQL?
Синтаксис создания пользователя выглядит правильно: https://www.postgresql.org/docs/8.0/sql-createuser.htmlCREATE USER davide WITH PASSWORD 'jw8s0F4';
Кажется, проблема с кавычками. Я пробовал несколько предложений, но никто не исправил это. Есть идеи?
Это работает:
echo "SELECT 'CREATE USER myuser' WHERE NOT EXISTS (SELECT FROM pg_roles WHERE rolname = 'myuser')\gexec" | psql -h myhost -U admin -d mydb
Но не удается из-за (я полагаю) ошибок кавычек при установке пароля:
echo "SELECT 'CREATE USER myuser' WITH PASSWORD 'mypassword' WHERE NOT EXISTS (SELECT FROM pg_roles WHERE rolname = 'myuser')\gexec" | psql -h myhost -U admin -d mydb
Сообщение об ошибке:
ERROR: syntax error at or near "WITH"
LINE 1: SELECT 'CREATE USER myuser' WITH PASSWORD 'mypassword' WHERE..
Добавил ошибку в описание.
Попробуйте удалить \gexec
из команды SQL.
@Niloct такая же проблема. Кажется, проблема с передачей котировок.
\gexec
немного запутан, он заставляет любой текст, выводимый командой SELECT
, использоваться в качестве нового SQL-запроса, но, возможно, вы можете выполнить приведенную выше команду без этой функции.
можешь попробовать echo "SELECT 'CREATE USER myuser WITH PASSWORD $$mypassword$$' WHERE NOT EXISTS (SELECT FROM pg_roles WHERE rolname = 'myuser')\gexec"
В основном это проблема SQL, мало связанная с bash. Я предлагаю вам сначала попробовать запрос в интерактивном режиме (без bash), и как только он сработает, поместите его в свой скрипт. В любом случае SELECT 'CREATE USER myuser' WITH PASSWORD
мне кажется неправильным. AFIK, SQL не имеет SELECT ... WITH PASSWORD
. Чего вы пытаетесь достичь здесь?
@jian, использующий $$ вокруг пароля, не работает.
Я добавил некоторую справочную информацию о том, что такое мотивация. Если есть более простая альтернатива, поделитесь.
echo "SELECT 'CREATE USER myuser WITH PASSWORD ''mypassword''' WHERE NOT EXISTS (SELECT FROM pg_roles WHERE rolname = 'myuser')\gexec" | psql -h myhost -U admin -d mydb
Ключевые выводы: экранируйте одинарные кавычки двойными одинарными кавычками, а строка в кавычках не должна содержать предложение WHERE
, поскольку \gexec
ожидает цитируемое содержимое как запрос, а CREATE USER
не имеет параметра WHERE
.
Спасибо за предложение, но оно не работает. echo "SELECT 'CREATE USER myuser WITH PASSWORD ''mypassword''' WHERE NOT EXISTS (SELECT FROM pg_roles WHERE rolname = 'myuser')"
Выдает эту ошибку: `?column? ------------------------------------------------------------- СОЗДАТЬ ПОЛЬЗОВАТЕЛЯ myuser С ПАРОЛЕМ 'mypassword' (1 строка) `
Ты поставил \gexec
в конце?
Вы должны использовать \gexec
, как в исходном коде, с моим обновленным оператором SQL. В противном случае он просто напечатает запрос, как вы прокомментировали. Скопируйте и вставьте мой ответ. Я проверил это на своем Mac, прежде чем ответить, и это работает.
Вы не написали, какое сообщение об ошибке вы получили.