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”语句时),或者其他一些明智的方法来轻松删除多个数据库?我在开发过程中需要此功能用于维护脚本。
在pgAdmin中的脚本中执行多个命令时,它们会自动包装到一个事务中。您可以显式begin
和commit
事务,但不能使用不会在事务上下文中运行的命令。手册:
DROP DATABASE
不能在事务块内执行。
在类似PSQL调用时使用-c command
。手册:
如果命令字符串包含多个 SQL 命令,则在单个事务中处理它们,除非字符串中包含显式
BEGIN
/COMMIT
命令以将其划分为多个事务。
但是,当通过标准输入馈送到psql时:
这与从文件中读取相同字符串或将相同字符串馈送到 psql 的标准输入时的行为不同,因为 psql 单独发送每个 SQL 命令。
由于这种行为,将多个 SQL 命令放入单个
-c
字符串中通常会产生意想不到的结果。最好使用重复的-c
命令或将多个命令提供给 psql 的标准输入,要么使用如上所示的 echo,要么通过 shell here-document,例如:Run Code Online (Sandbox Code Playgroud)psql <<EOF \x SELECT * FROM foo; EOF
因此,您可以在默认自动提交模式下将 psql 与标准输入一起使用。
否则,您只能运行单独的命令。
您可以使用 shell-command dropdb
- 或者用它编写一个 shell-script 来删除多个数据库。
顺便说一句,您可以从 pgAdmin 和 psql 运行的唯一区别是 psql 的元命令- 不是 SQL。这些由 psql 而不是数据库引擎解释。要在元命令和 SQL 之间切换,请使用分隔符元命令\\
。手册中有一个例子。