PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Django non può eliminare il database:psycopg2.OperationalError:impossibile eliminare il database attualmente aperto

TL;DR

Se vuoi solo la soluzione, eccola qui. Assicurati che il tuo server Postgres abbia un database "postgres". Puoi controllare collegandoti tramite psql e eseguendo /list o /l . Puoi creare il database eseguendo:CREATE DATABASE postgres in psql.

Esteso

Django preferisce non eseguire "query di inizializzazione" (presumibilmente cose come la creazione del database di test) dal database "predefinito" specificato nei tuoi DATABASES ambientazione. Si presume che questo sia il database di produzione, quindi sarebbe nell'interesse di Django non scherzare lì.

Ecco perché all'inizio dei test viene mostrato questo (ignora il mio filesystem):

    /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 cerca un database chiamato "postgres" sull'host specificato nei tuoi DATABASES impostazioni, è qui che esegue le query per creare ed eliminare il database di test. (Nota:Django non ha bisogno che il database "postgres" sia specificato esplicitamente nelle tue impostazioni, lo cerca semplicemente su qualsiasi server di database sia specificato nelle tue impostazioni).

Sembra che se questo database "postgres" non esiste, Django può creare il database di test ed eseguire i test, ma non può eliminare il database di test. Ciò potrebbe essere dovuto al fatto che Postgres non ti consente di eliminare il database a cui sei attualmente connesso, tuttavia a me sembra che non ci sia motivo per cui Django non possa semplicemente eliminare il database di test dal database "predefinito" (di produzione) specificato in le impostazioni. Presumo che stia utilizzando il database "predefinito" per creare il database di test, quindi sembra che non ci sia motivo per cui non possa eliminarlo anche lui.

In ogni caso, la soluzione era semplicemente creare quel database "postgres" con una semplice istruzione SQL:CREATE DATABASE postgres . Dopo che il database è stato creato, tutto ha funzionato correttamente.