Как отладить синтаксическую ошибку postgres в или около - PullRequest
0 голосов
/ 07 мая 2020

У меня есть контейнер postgres 10.6, работающий с docker -compose. Я пытался использовать команду для создания пользователя, но она не работает.

docker-compose exec kong-database psql -U postgres -c 'CREATE ROLE joe PASSWORD 'md5b5f5ba1a423792b526f799ae4eb3d59e' SUPERUSER CREATEDB CREATEROLE INHERIT LOGIN;'

Кроме того,

Я получаю эту ошибку

ERROR:  syntax error at or near "md5b5f5ba1a423792b526f799ae4eb3d59e"
LINE 1: CREATE ROLE joe PASSWORD md5b5f5ba1a423792b526f799ae4eb3d59e...
                                 ^

Кроме того,

docker-compose exec kong-database psql -U postgres -c 'CREATE ROLE davide LOGIN PASSWORD 'jw8s0F4' '

Та же ошибка,

ERROR:  syntax error at or near "jw8s0F4"
LINE 1: CREATE ROLE davide LOGIN PASSWORD jw8s0F4 
                                          ^

Очевидно, когда я не использую WITH PASSWORD или PASSWORD в команде, она проходит. Но я должен защитить базу данных паролем.

Что не так?

1 Ответ

0 голосов
/ 07 мая 2020

Одиночные кавычки вокруг пароля съедаются оболочкой до того, как PostgreSQL их увидит. Вам нужно как-то избежать их.

Один из способов - заключить всю вашу команду в кавычки, используя двойные кавычки оболочки, а не одинарные кавычки, поскольку одинарные кавычки внутри двойных кавычек не являются особенными.

 psql  -c "CREATE ROLE davide2 LOGIN PASSWORD 'jw8s0F4'"

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

Если я уберу их, удвоив их, я все равно получу ту же ошибку

удвоение кавычки - это то, как вы избегаете их внутри SQL, но это не то, как вы избегаете их в оболочке. Проблема в том, что ваши одинарные кавычки не попадают в SQL в первую очередь потому, что оболочка их съедает.

Если двойные кавычки оболочки для всей команды не работают для вас, иначе вы экранирование одинарных кавычек в оболочке - это обратный удар. Проблема в том, что обратный удар внутри одинарных кавычек не работает как выход, поэтому вам нужно закрыть одинарные кавычки, вернуть одинарную кавычку, затем снова открыть одинарные кавычки, а затем повторить все это на другом конце. Кроме того, в целях тестирования вы можете заменить psql -c на echo, чтобы вы могли видеть, что оболочка будет передавать в psql, не запуская его.

echo 'CREATE ROLE davide3 LOGIN PASSWORD '\''jw8s0F4'\'' '
...