postgresql - 如何使用 PSQL 客户端运行多个命令
问题描述
我一直在尝试通过 psql 客户端运行多个命令以连接到远程数据库并在一行中运行一些命令,但这似乎是不可能的?
我试图在命令下运行,它在执行第一个命令后给了我直接的错误。我在环境中设置了所有 bash 变量。
PGPASSWORD=${ADMIN_PASSWORD} psql -h ${REMOTE_HOST} -U postgres -d ${SOME_DATABASE} -c 'CREATE EXTENSION IF NOT EXISTS "uuid-ossp";' -c "CREATE USER '$DB_USER' WITH PASSWORD '${DB_PASSWORD}';" -c 'GRANT ALL PRIVILEGES ON DATABASE "${DB_DATABASE}" TO "${DB_USER}";'
当我运行它时,看起来只有第一个命令成功,我从 psql 帮助中阅读了指令-c, --command=COMMAND run only single command (SQL or internal) and exit
。
但是有没有办法利用 bash 管道或反斜杠以这种方式使用它?
解决方案
您那里有一个杂散的反斜杠,这肯定会弄乱东西。
-c "创建用户'$DB_USER'..."
用户名需要不加引号,或者用双引号引起来。不允许用单引号引用它。
-c 'GRANT ALL PRIVILEGES ON DATABASE "${DB_DATABASE}"...'
shell 变量替换不会发生在由最外层单引号引起来的字符串内,因此这是引用文字 string "${DB_DATABASE}"
。
如果您还需要文字双引号和变量替换,您可以使用单引号,但在变量之前停止它们,然后再拿起。或使用双引号,但转义文字双引号。(这个是带的bash
,其他shell我不知道)
$ export foo=bar-baz
$ echo 'here is "'$foo'" within quotes'
here is "bar-baz" within quotes
$ echo "here is \"$foo\" within quotes"
here is "bar-baz" within quotes
推荐阅读
- xml - 用于返回指向包含 xml 文件中某些字符串的文本节点的绝对静态 xpath 的工具
- python - 使用每个元组的关键部分将元组列表转换为字典
- python - 在 Python 中,如何在使用嵌套 for 循环时跳过列表中的项目,但仅在某些条件下?
- python - 使用python请求模块时未发送保持活动消息
- apache-spark - 插入时在增量表中自动增加 id
- python - 如何在 Keras 输入模型中包含转换?
- reactjs - 从文件系统播放音频文件的列在排序或分页时不会改变
- javascript - 减少大型 Angular 8 中的构建时间
- python - 如何将 Python 中的图像编码为 Base64?
- elasticsearch - 究竟什么是分片?