現在接続しているデータベースを削除しようとしていますが、このエラーが発生しています:
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()
}
別のデータベースに接続してからその接続で実行できると思いますが、それが機能するかどうかはわかりません。別のデータベースを削除するためだけに新しいデータベースに接続しなければならないのは本当に奇妙に思えます。何か案は?ありがとう。
なぜなら、あなたは接続を開いているデータベースでdropDb
コマンドを実行しようとしているからです。
Postgresのドキュメントによると:
削除しようとしているデータベースに接続できません。代わりに、template1または他のデータベースに接続し、このコマンドを再度実行してください。
これは理にかなっています。データベース全体を削除すると、そのデータベースを参照しているすべてのオープン接続が無効になるため、別のデータベースに接続してこのコマンドを再度実行することをお勧めします。
別のクライアントがデータベースに接続されている状況に直面していて、本当にデータベースを削除したい場合は、その特定のデータベースからすべてのクライアントを強制的に切断できます。
たとえば、すべてのクライアントをデータベースmydb
から強制的に切断するには:
PostgreSQL <9.2の場合
SELECT pg_terminate_backend(procpid) FROM pg_stat_activity WHERE datname = 'mydb';
Else
SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname = 'mydb';
注:このコマンドにはスーパーユーザー権限が必要です。
その後、別のデータベースに接続し、dropDb
コマンドを再度実行できます。