Postgres drop database error: pq: не удается удалить текущую открытую базу данных

Я пытаюсь удалить базу данных, к которой я в настоящее время подключен, как так, но я получаю эту ошибку:

pq: cannot drop the currently open database

Я действительно не понимаю, как я должен удалить базу данных, если мне нужно закрыть соединение, потому что тогда я не думаю, что смогу использовать dbConn.Exec для выполнения инструкции базы данных DROP?

dbConn *sql.DB

func stuff() error {
  _, err := dbConn.Exec(fmt.Sprintf(`DROP DATABASE %s;`, dbName))
  if err != nil {
    return err
  }

  return dbConn.Close()
}

Я думаю, я мог бы подключиться к другой базе данных, а затем выполнить ее на этом соединении, но я даже не уверен, что это сработает, и кажется очень странно подключаться к новой базе данных, чтобы удалить другую базу данных. Есть идеи? Спасибо.

1 ответов


потому что вы пытаетесь выполнить dropDb команда на базе данных, к которой у вас есть открытое соединение.

согласно документации postgres:

вы не можете быть подключены к базе данных, которую вы собираетесь удалить. Вместо этого подключитесь к template1 или любой другой базе данных и снова запустите эту команду.

это имеет смысл, потому что при удалении всей базы данных все открытое соединение, ссылающееся на эту базу данных, становится недействительным, поэтому рекомендуется подключиться к другой базе данных и выполнить эту команду снова.

если вы столкнулись с ситуацией, когда другой клиент подключается к базе данных, и вы действительно хотите удалить базу данных, вы можете принудительно отключить всех клиентов из этой базы данных.

например, принудительно отключить всех клиентов от базы данных mydb:

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

Примечание: эта команда требует привилегии суперпользователя.

затем вы можете подключиться к другой базе данных, и запустите снова.