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

时间:2016-04-08 14:37:04

标签: postgresql 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()
}

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

5 个答案:

答案 0 :(得分:14)

因为,您正尝试在已打开连接的数据库上执行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命令。

答案 1 :(得分:7)

如果您在IntelliJ中遇到此问题,请使用以下下拉列表将架构更改为postgres。

之后,我可以删除数据库。

enter image description here

答案 2 :(得分:1)

我的表结构:

<头>
数据库
postgres foo1
foo2
foo3
foo4
foo5

打开时,数据库 foo2\c foo2\dt - 我可以查看数据库 foo2 下的数据库表。

当我检查完数据库后,不再需要该数据库时,需要用DROP DATABASE foo2删除该数据库。

我得到了上面的错误,问题如下。

删除数据库:

\c postgres

那么 DROP DATABASE foo2 有效

答案 3 :(得分:0)

这些对我都不起作用,因为我尝试通过pgAdmin进行操作,该操作使数据库连接一经删除便保持打开状态。

解决方案:

C:\Program Files\PostgreSQL\11\scripts\runpsql.bat

提供正确的信息后,您将能够获得pg命令提示符,您可以在此处键入:

dbdrop yourdatabase

此后,您仍然可能会在pgAdmin中看到数据库,但是现在您只需使用右键单击和DELETE/DROP选项就可以将其删除。

答案 4 :(得分:0)

我在Windows 10中使用PostgreSQL 12和pgAdmin-4。我不得不使用上述答案的组合来删除数据库,由于无法关闭pgAdmin中的所有打开的连接,因此无法删除pgAdmin。

关闭pgAdmin-4。

在Windows命令行中,假设我的服务器名为postgres,数据库为mydb:

C:\> psql -U postgres

我使用服务器密码登录。

然后我关闭了与mydb的所有打开的连接:

postgres-# SELECT * FROM pg_stat_activity WHERE pg_stat_activity.datname='mydb';
postgres-# SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname = 'mydb';

最后,我成功删除了mydb:

postgres-# DROP DATABASE mydb;

现在,如果我回到pgAdmin-4,它就消失了。