Postgres drop database 报错:pq: cannot drop the currently open database

新手上路,请多包涵

我正试图删除我当前连接的数据库,但出现此错误:

 pq: cannot drop the currently open database

我真的不明白如果我必须关闭我的连接我应该如何删除数据库,因为那样我不认为我将能够使用 dbConn.Exec 来执行我的 DROP DATABASE 语句?

 dbConn *sql.DB

func stuff() error {
  _, err := dbConn.Exec(fmt.Sprintf(`DROP DATABASE %s;`, dbName))
  if err != nil {
    return err
  }

  return dbConn.Close()
}

我想我可以连接到一个不同的数据库,然后在该连接上执行它,但我什至不确定这是否有效,而且必须连接到一个新数据库只是为了删除一个不同的数据库似乎真的很奇怪。有任何想法吗?谢谢。

原文由 b0xxed1n 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.9k
2 个回答

因为,您正试图在数据库上执行 dropDb 命令,您已打开连接。

根据 postgres 文档:

您无法连接到要删除的数据库。相反,连接到 template1 或任何其他数据库并再次运行此命令。

这是有道理的,因为当你删除整个数据库时,所有指向该数据库的打开连接都将失效,所以推荐的方法是连接到不同的数据库,并再次执行该命令。

如果您面临这样一种情况,即不同的客户端连接到数据库,而您真的想删除数据库,您可以强行断开所有客户端与该特定数据库的连接。

例如,强制断开所有客户端与数据库 mydb 的连接:

如果 PostgreSQL < 9.2

SELECT pg_terminate_backend(procpid) FROM pg_stat_activity WHERE datname = 'mydb';

别的

SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname = 'mydb';

注意: 此命令需要超级用户权限。

然后,您可以连接到不同的数据库,并再次运行 dropDb 命令。

原文由 Parth Desai 发布,翻译遵循 CC BY-SA 4.0 许可协议

如果您在 IntelliJ 中遇到此问题,请将具有以下下拉列表的模式更改为 postgres。

在那之后,我能够删除一个数据库。

在此处输入图像描述

原文由 simibac 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏