J'essaie de supprimer la base de données à laquelle je suis actuellement connecté, mais je reçois cette erreur:
pq: cannot drop the currently open database
Je ne comprends pas vraiment comment je dois abandonner la base de données si je dois fermer ma connexion, car je ne pense pas pouvoir utiliser dbConn.Exec pour exécuter mon instruction 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()
}
Je suppose que je pourrais me connecter à une autre base de données, puis l'exécuter sur cette connexion, mais je ne suis même pas sûr que cela fonctionnerait, et il semble vraiment bizarre de devoir se connecter à une nouvelle base de données juste pour supprimer une autre base de données. Des idées? Merci.
Parce que vous essayez d'exécuter la commande dropDb
sur la base de données à laquelle vous avez une connexion ouverte.
Selon la documentation postgres:
Vous ne pouvez pas être connecté à la base de données que vous êtes sur le point de supprimer. Au lieu de cela, connectez-vous à template1 ou à toute autre base de données et réexécutez cette commande.
Cela a du sens, car lorsque vous supprimez la base de données entière, toute la connexion ouverte faisant référence à cette base de données devient invalide. L'approche recommandée consiste donc à vous connecter à une base de données différente et à exécuter à nouveau cette commande.
Si vous êtes confronté à une situation, où un client différent est connecté à la base de données et que vous souhaitez vraiment supprimer la base de données, vous pouvez déconnecter de force tous les clients de cette base de données particulière.
Par exemple, pour déconnecter de force tous les clients de la base de données mydb
:
Si PostgreSQL <9.2
SELECT pg_terminate_backend(procpid) FROM pg_stat_activity WHERE datname = 'mydb';
Sinon
SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname = 'mydb';
Remarque: Cette commande nécessite des privilèges de superutilisateur.
Ensuite, vous pouvez vous connecter à différentes bases de données et réexécuter la commande dropDb
.