我试图删除当前连接的数据库,但我收到此错误:
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()
}
我想我可以连接到另一个数据库,然后在该连接上执行它,但我甚至不确定它是否有效,并且连接到新数据库似乎很奇怪只是删除一个不同的数据库。有任何想法吗?感谢。
答案 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)
答案 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,它就消失了。