PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Django ne peut pas supprimer la base de données :psycopg2.OperationalError :impossible de supprimer la base de données actuellement ouverte

TL;DR

Si vous voulez juste la solution, la voici. Assurez-vous que votre serveur Postgres dispose d'une base de données "postgres". Vous pouvez vérifier en vous connectant via psql , et en exécutant /list ou /l . Vous pouvez créer la base de données en exécutant :CREATE DATABASE postgres en psql.

Étendu

Django préfère ne pas exécuter de "requêtes d'initialisation" (probablement des choses comme la création de la base de données de test) à partir de la base de données "par défaut" spécifiée dans vos DATABASES paramètre. Ceci est supposé être la base de données de production, il serait donc dans l'intérêt de Django de ne pas s'y perdre.

C'est pourquoi au début des tests, ceci s'affiche (ignorez mon système de fichiers) :

    /Users/dcgoss/Desktop/Pickle/PickleBackend/venv/lib/python3.4/site-packages/django/db/backends/postgresql/base.py:247: 
    RuntimeWarning: Normally Django will use a connection to the 'postgres' database to avoid running initialization queries against the production database when it's not needed 
    (for example, when running tests). Django was unable to create a connection to the 'postgres' database and will use the default database instead.
    RuntimeWarning

Django recherche une base de données nommée "postgres" sur l'hôte spécifié dans votre DATABASES paramètres, c'est là qu'il exécute les requêtes pour créer et supprimer votre base de données de test. (Remarque :Django n'a pas besoin que la base de données "postgres" soit explicitement spécifiée dans vos paramètres, il la recherche simplement sur le serveur de base de données spécifié dans vos paramètres).

Il apparaît que si cette base de données "postgres" n'existe pas, Django peut créer la base de données de test et exécuter les tests, mais il ne peut pas supprimer la base de données de test. Cela peut être dû au fait que Postgres ne vous permet pas de supprimer la base de données à laquelle vous êtes actuellement connecté, mais il me semble qu'il n'y a aucune raison pour que Django ne puisse pas simplement supprimer la base de données de test de la base de données "par défaut" (production) spécifiée dans les paramètres. Je suppose qu'il utilise la base de données "par défaut" pour créer la base de données de test, il semble donc qu'il n'y ait aucune raison pour qu'il ne puisse pas la supprimer également.

Quoi qu'il en soit, la solution consistait simplement à créer cette base de données "postgres" avec une simple instruction SQL :CREATE DATABASE postgres . Après la création de cette base de données, tout a bien fonctionné.