【问题标题】:Handling Postgresql quotes when running in Bash [closed]在 Bash 中运行时处理 Postgresql 引号 [关闭]
【发布时间】:2022-11-13 11:50:24
【问题描述】:

背景

目的是在启动时创建数据库和用户(如果它们不存在)。使用此处描述的 bash 解决方法:Simulate CREATE DATABASE IF NOT EXISTS for PostgreSQL?

引号似乎有问题。我尝试了许多建议,但没有一个解决它。有任何想法吗?

这有效:

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

【问题讨论】:

  • 您没有发布收到的错误消息。
  • 我已将错误添加到描述中。
  • 尝试从 SQL 命令中删除 \gexec
  • @Niloct 同样的问题。似乎是传递报价的问题。
  • \gexec 有点复杂,它使 SELECT 命令输出的任何文本都用作新的 SQL 查询,但也许您可以在没有此功能的情况下执行上述命令。

标签: linux postgresql bash


【解决方案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 WITH PASSWORD 'mypassword'(1 行)`
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-18
  • 2012-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多