在一个脚本中删除多个数据库

Tom*_*mas 5 postgresql pgadmin psql scripting

我想弄清楚如何在一个 sql 脚本中删除 PostgreSQL 上的多个数据库。我最好需要它在pgAdmin控制台中执行时和在psql命令行工具中使用时都能工作。当我做:

DROP DATABASE db1;
DROP DATABASE db2;
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

无法从函数或多命令字符串执行 DROP DATABASE

有没有办法解决这个问题?即,有没有办法单独运行每个命令(比如在 MSSQL 上使用“GO”语句时),或者其他一些明智的方法来轻松删除多个数据库?我在开发过程中需要此功能用于维护脚本。

Erw*_*ter 6

pgAdmin中的脚本中执行多个命令时,它们会自动包装到一个事务中。您可以显式begincommit事务,但不能使用不会在事务上下文中运行的命令。手册:

DROP DATABASE 不能在事务块内执行。

在类似PSQL调用时使用-c command手册:

如果命令字符串包含多个 SQL 命令,则在单个事务中处理它们,除非字符串中包含显式 BEGIN/COMMIT命令以将其划分为多个事务。

但是,当通过标准输入馈送到psql时:

这与从文件中读取相同字符串或将相同字符串馈送到 psql 的标准输入时的行为不同,因为 psql 单独发送每个 SQL 命令。

由于这种行为,将多个 SQL 命令放入单个-c字符串中通常会产生意想不到的结果。最好使用重复的-c命令或将多个命令提供给 psql 的标准输入,要么使用如上所示的 echo,要么通过 shell here-document,例如:

psql <<EOF
\x
SELECT * FROM foo;
EOF
Run Code Online (Sandbox Code Playgroud)

因此,您可以在默认自动提交模式下将 psql 与标准输入一起使用。
否则,您只能运行单独的命令

您可以使用 shell-command dropdb- 或者用它编写一个 shell-script 来删除多个数据库。

顺便说一句,您可以从 pgAdmin 和 psql 运行的唯一区别是 psql 的元命令- 不是 SQL。这些由 psql 而不是数据库引擎解释。要在元命令和 SQL 之间切换,请使用分隔符元命令\\手册中有一个例子