Postgresql 如何在或附近调试postgres语法错误
我有一个运行docker compose的postgres 10.6容器。 我尝试使用该命令创建用户,但它不起作用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 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'\'' '