一尘不染

Postgres删除数据库错误:pq:无法删除当前打开的数据库

go

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

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()
}

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


阅读 1480

收藏
2020-07-02

共1个答案

一尘不染

因为,您正在尝试对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再次运行命令。

2020-07-02