PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Django kann Datenbank nicht löschen:psycopg2.OperationalError:Die derzeit geöffnete Datenbank kann nicht gelöscht werden

TL;DR

Wenn Sie nur die Lösung wollen, hier ist sie. Stellen Sie sicher, dass Ihr Postgres-Server über eine „postgres“-Datenbank verfügt. Sie können dies überprüfen, indem Sie eine Verbindung über psql herstellen , und führen Sie /list aus oder /l . Sie können die Datenbank erstellen, indem Sie Folgendes ausführen:CREATE DATABASE postgres in psql.

Erweitert

Django zieht es vor, keine "Initialisierungsabfragen" (vermutlich Dinge wie das Erstellen der Testdatenbank) von der "Standard"-Datenbank auszuführen, die in Ihren DATABASES angegeben ist Einstellung. Es wird angenommen, dass dies die Produktionsdatenbank ist, also wäre es in Djangos bestem Interesse, dort nicht herumzuspielen.

Deshalb wird zu Beginn der Tests Folgendes angezeigt (ignoriere mein Dateisystem):

    /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 sucht nach einer Datenbank namens „postgres“ auf dem Host, der in Ihren DATABASES angegeben ist Einstellungen, hier werden die Abfragen zum Erstellen und Löschen Ihrer Testdatenbank ausgeführt. (Hinweis:Django muss die „postgres“-Datenbank nicht explizit in Ihren Einstellungen angeben, es sucht einfach auf dem Datenbankserver, der in Ihren Einstellungen angegeben ist).

Es scheint, dass Django, wenn diese „postgres“-Datenbank nicht existiert, die Testdatenbank erstellen und die Tests ausführen kann, aber die Testdatenbank nicht löschen kann. Dies kann daran liegen, dass Postgres es Ihnen nicht erlaubt, die Datenbank zu löschen, mit der Sie derzeit verbunden sind, aber für mich scheint es keinen Grund zu geben, warum Django die Testdatenbank nicht einfach aus der in angegebenen "Standard" (Produktion)-Datenbank löschen könnte Einstellungen. Ich nehme an, es verwendet die "Standard"-Datenbank, um die Testdatenbank zu erstellen, also scheint es keinen Grund zu geben, warum es sie nicht auch löschen kann.

Unabhängig davon bestand die Lösung darin, diese „postgres“-Datenbank einfach mit einer einfachen SQL-Anweisung zu erstellen:CREATE DATABASE postgres . Nachdem diese Datenbank erstellt wurde, funktionierte alles einwandfrei.