1. ホーム
  2. postgresql

[解決済み] Postgres のデータベース削除エラー: pq: 現在開いているデータベースを削除できません。

2022-02-10 15:36:57

質問内容

現在接続しているデータベースをこのように落とそうとしているのですが、このようなエラーが出てしまいます。

pq: cannot drop the currently open database

DROP DATABASEステートメントを実行するためにdbConn.Execを使用することができないと思うので、接続を閉じなければならない場合、データベースをドロップすることをどのように期待されているのか、よく理解できません。

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';

エルゼ

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

このコマンドはスーパーユーザー権限が必要です。

次に、別のデータベースに接続して dropDb コマンドを再度実行します。