Maison >développement back-end >Golang >Comment supprimer une base de données PostgreSQL actuellement connectée ?

Comment supprimer une base de données PostgreSQL actuellement connectée ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-11-19 12:15:03749parcourir

How to Drop a Currently Connected PostgreSQL Database?

Erreur lors de la suppression de la base de données Postgres actuellement connectée

Lorsque vous essayez de supprimer la base de données à laquelle vous êtes actuellement connecté dans Postgres, vous pouvez rencontrer l'erreur suivante :

pq: cannot drop the currently open database

Cette erreur se produit car les suppressions de bases de données nécessitent une connexion fermée à la base de données en cours de suppression. La confusion réside dans l'incapacité d'exécuter DROP DATABASE à l'aide de dbConn.Exec si la connexion est fermée.

Solution

L'approche recommandée pour supprimer une base de données actuellement connectée consiste à se connecter à une autre base de données et exécutez la commande DROP DATABASE à partir de là. En effet, la connexion à la base de données en cours de suppression devient invalide lors de sa suppression.

Par exemple :

import "github.com/lib/pq"

...

func dropDatabase(dbName string) error {
    // Connect to a different database (e.g., template1)
    otherConn, err := pq.Open("other_conn_string")
    if err != nil {
        return err
    }
    defer otherConn.Close()
    
    // Drop the desired database from the other connection
    _, err = otherConn.Exec(fmt.Sprintf(`DROP DATABASE %s;`, dbName))
    return err
}

Approche alternative (déconnexion forcée)

Dans les scénarios où un Si un client différent est connecté à la base de données en cours de suppression et que vous avez besoin d'une suppression urgente, vous pouvez forcer la déconnexion de tous les clients de la base de données cible à l'aide des commandes suivantes (les exigences varient en fonction de Version PostgreSQL) :

-- PostgreSQL < 9.2
SELECT pg_terminate_backend(procpid) FROM pg_stat_activity WHERE datname = 'mydb';

-- PostgreSQL >= 9.2
SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname = 'mydb';

Remarque : Exécutez ces commandes avec les privilèges de superutilisateur. Une fois les clients déconnectés de force, vous pouvez vous connecter à une autre base de données et exécuter la commande DROP DATABASE.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn