Обработка кавычек Postgresql при работе в Bash

Задний план

Цель состоит в том, чтобы создать базу данных и пользователя при запуске, если они не существуют. Используя обходной путь 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..

Вы не написали, какое сообщение об ошибке вы получили.

user1934428 11.11.2022 08:56

Добавил ошибку в описание.

user45097 11.11.2022 09:43

Попробуйте удалить \gexec из команды SQL.

Niloct 11.11.2022 09:47

@Niloct такая же проблема. Кажется, проблема с передачей котировок.

user45097 11.11.2022 09:51

\gexec немного запутан, он заставляет любой текст, выводимый командой SELECT, использоваться в качестве нового SQL-запроса, но, возможно, вы можете выполнить приведенную выше команду без этой функции.

Niloct 11.11.2022 09:59

можешь попробовать echo "SELECT 'CREATE USER myuser WITH PASSWORD $$mypassword$$' WHERE NOT EXISTS (SELECT FROM pg_roles WHERE rolname = 'myuser')\gexec"

jian 11.11.2022 09:59

В основном это проблема SQL, мало связанная с bash. Я предлагаю вам сначала попробовать запрос в интерактивном режиме (без bash), и как только он сработает, поместите его в свой скрипт. В любом случае SELECT 'CREATE USER myuser' WITH PASSWORD мне кажется неправильным. AFIK, SQL не имеет SELECT ... WITH PASSWORD. Чего вы пытаетесь достичь здесь?

user1934428 11.11.2022 10:14

@jian, использующий $$ вокруг пароля, не работает.

user45097 13.11.2022 04:46

Я добавил некоторую справочную информацию о том, что такое мотивация. Если есть более простая альтернатива, поделитесь.

user45097 13.11.2022 04:46
Шаблоны Angular PrimeNg
Шаблоны Angular PrimeNg
Как привнести проверку типов в наши шаблоны Angular, использующие компоненты библиотеки PrimeNg, и настроить их отображение с помощью встроенной...
Создайте ползком, похожим на звездные войны, с помощью CSS и Javascript
Создайте ползком, похожим на звездные войны, с помощью CSS и Javascript
Если вы веб-разработчик (или хотите им стать), то вы наверняка гик и вам нравятся "Звездные войны". А как бы вы хотели, чтобы фоном для вашего...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Начала с розового дизайна
Начала с розового дизайна
Pink Design - это система дизайна Appwrite с открытым исходным кодом для создания последовательных и многократно используемых пользовательских...
Шлюз в PHP
Шлюз в PHP
API-шлюз (AG) - это сервер, который действует как единая точка входа для набора микросервисов.
14 Задание: Типы данных и структуры данных Python для DevOps
14 Задание: Типы данных и структуры данных Python для DevOps
проверить тип данных используемой переменной, мы можем просто написать: your_variable=100
1
9
66
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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 строка) `

user45097 13.11.2022 04:39

Ты поставил \gexec в конце?

Niloct 13.11.2022 08:21

Вы должны использовать \gexec, как в исходном коде, с моим обновленным оператором SQL. В противном случае он просто напечатает запрос, как вы прокомментировали. Скопируйте и вставьте мой ответ. Я проверил это на своем Mac, прежде чем ответить, и это работает.

Niloct 14.11.2022 16:25

Другие вопросы по теме