web-dev-qa-db-ja.com

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()
}

別のデータベースに接続してからその接続で実行できると思いますが、それが機能するかどうかはわかりません。別のデータベースを削除するためだけに新しいデータベースに接続しなければならないのは本当に奇妙に思えます。何か案は?ありがとう。

14
b0xxed1n

なぜなら、あなたは接続を開いているデータベースで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コマンドを再度実行できます。

16
desaiparth