2016-04-08 419 views
4

我想放棄我目前連接到像現在這樣的數據庫,但我得到這個錯誤:的Postgres刪除數據庫錯誤:PQ:不能刪除當前打開的數據庫

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

因爲您試圖在數據庫上執行dropDb命令,您已將其打開連接。

據Postgres的文檔:

You cannot be connected to the database you are about to remove. Instead, connect to template1 or any other database and run this command again.

這是有道理的,因爲當你把整個數據庫,所有打開的連接引用到該數據庫變得無效,所以推薦的方法是連接到不同的數據庫,並再次執行此命令。

如果您面臨的情況是,將不同的客戶端連接到數據庫,並且確實想要刪除數據庫,則可以強制斷開該特定數據庫中的所有客戶端。

例如,要強行從數據庫mydb斷開所有客戶:

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

注:這個命令需要超級用戶權限。

然後,您可以連接到不同的數據庫,並再次運行dropDb命令。