如何使用 PSQL 客户端 运行 多个命令
How can I run multiple commands with PSQL client
我一直在尝试 运行 通过 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 "CREATE USER '$DB_USER'..."
用户名需要不加引号或用双引号引起来。不允许用单引号引用它。
-c 'GRANT ALL PRIVILEGES ON DATABASE "${DB_DATABASE}"...'
shell 变量替换不会发生在由最外层单引号分隔的字符串内,因此这是引用文字字符串 "${DB_DATABASE}"
.
如果您还需要文字双引号和变量替换,您可以使用单引号但将它们停在变量之前,然后再使用。或者使用双引号,但转义文字双引号。 (这是 bash
,我不知道其他 shells)
$ 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
谢谢,我想我只能通过下面的命令传递多个命令。如果我在数据库名称和用户名中使用不同类型的名称(例如破折号(-)和多个破折号),有人会认为这是一个问题吗?
我的bash变量是之前设置的。
因此,如果用户名或数据库名称包含破折号“-”,则以下解决方案将失败。另外 DB_PASSWORD 必须带有单个引号。
echo 'CREATE USER '${USER}' WITH PASSWORD '$DB_PASSWORD'; GRANT ALL PRIVILEGES ON DATABASE '${DB}' TO "${USER}";' | PGPASSWORD=mysecretpassword psql -U postgres -d ${DB}
CREATE ROLE
GRANT
我一直在尝试 运行 通过 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 "CREATE USER '$DB_USER'..."
用户名需要不加引号或用双引号引起来。不允许用单引号引用它。
-c 'GRANT ALL PRIVILEGES ON DATABASE "${DB_DATABASE}"...'
shell 变量替换不会发生在由最外层单引号分隔的字符串内,因此这是引用文字字符串 "${DB_DATABASE}"
.
如果您还需要文字双引号和变量替换,您可以使用单引号但将它们停在变量之前,然后再使用。或者使用双引号,但转义文字双引号。 (这是 bash
,我不知道其他 shells)
$ 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
谢谢,我想我只能通过下面的命令传递多个命令。如果我在数据库名称和用户名中使用不同类型的名称(例如破折号(-)和多个破折号),有人会认为这是一个问题吗?
我的bash变量是之前设置的。 因此,如果用户名或数据库名称包含破折号“-”,则以下解决方案将失败。另外 DB_PASSWORD 必须带有单个引号。
echo 'CREATE USER '${USER}' WITH PASSWORD '$DB_PASSWORD'; GRANT ALL PRIVILEGES ON DATABASE '${DB}' TO "${USER}";' | PGPASSWORD=mysecretpassword psql -U postgres -d ${DB}
CREATE ROLE
GRANT