我正试图删除我当前连接的数据库,但出现此错误:
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 许可协议
因为,您正试图在数据库上执行
dropDb
命令,您已打开连接。根据 postgres 文档:
这是有道理的,因为当你删除整个数据库时,所有指向该数据库的打开连接都将失效,所以推荐的方法是连接到不同的数据库,并再次执行该命令。
如果您面临这样一种情况,即不同的客户端连接到数据库,而您真的想删除数据库,您可以强行断开所有客户端与该特定数据库的连接。
例如,强制断开所有客户端与数据库
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
命令。