Postgresql 如何在或附近调试postgres语法错误

Postgresql 如何在或附近调试postgres语法错误,postgresql,docker-compose,postgres-10,Postgresql,Docker Compose,Postgres 10,我有一个运行docker compose的postgres 10.6容器。 我尝试使用该命令创建用户,但它不起作用 docker-compose exec kong-database psql -U postgres -c 'CREATE ROLE joe PASSWORD 'md5b5f5ba1a423792b526f799ae4eb3d59e' SUPERUSER CREATEDB CREATEROLE INHERIT LOGIN;' 而且 我得到了这个错误 ERROR: syntax

我有一个运行docker compose的postgres 10.6容器。 我尝试使用该命令创建用户,但它不起作用

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...
                                 ^

而且

同样的错误

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

显然,当我在命令中不使用带密码的
PASSWORD
时,它会通过。但我必须用密码保护数据库


怎么了?

在PostgreSQL看到密码前,密码周围的单引号已经被shell吃掉了。你需要设法逃离他们

一种方法是使用shell双引号而不是单引号引用整个命令,因为双引号中的单引号并不特殊

 psql  -c "CREATE ROLE davide2 LOGIN PASSWORD 'jw8s0F4'"
但如果您的密码包含特殊的双引号字符,如美元符号,这将是一个问题。(因此,只需将密码加长,并从中排除任何此类字符)

如果我通过加倍来逃避它们,我仍然会得到同样的错误

双引号是在SQL中转义它们的方式,而不是在shell中转义它们的方式。问题是,单引号首先没有进入SQL,因为shell会吃掉它们

如果整个命令的shell双引号不适用于您,那么在shell中转义单引号的另一种方法是使用反击。问题是单引号内的反击不能作为转义,因此您必须关闭单引号,反击单引号,然后重新打开单引号,然后在另一端重复整个过程。此外,出于测试目的,您可以将
psql-c
替换为
echo
,这样您就可以看到shell将传递到psql中的内容,而无需实际运行它

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

密码需要用单引号括起来,所以如果你把它作为一个值在单引号中传递,你需要将其转义。@a_horse_和_no_name我不明白。如果我通过将它们加倍来转义它们,我仍然会得到与在命令行(由docker命令运行)而不是SQL中进行转义相同的错误
echo 'CREATE ROLE davide3 LOGIN PASSWORD '\''jw8s0F4'\'' '