sql >> Base de Datos >  >> RDS >> PostgreSQL

Django no puede eliminar la base de datos:psycopg2.OperationalError:no puede eliminar la base de datos actualmente abierta

TL;DR

Si solo desea la solución, aquí está. Asegúrese de que su servidor Postgres tenga una base de datos "postgres". Puede verificar conectándose a través de psql y ejecutando /list o /l . Puede crear la base de datos ejecutando:CREATE DATABASE postgres en psql.

Extendido

Django prefiere no ejecutar "consultas de inicialización" (presumiblemente cosas como crear la base de datos de prueba) desde la base de datos "predeterminada" especificada en sus DATABASES ajuste. Se supone que esta es la base de datos de producción, por lo que lo mejor para Django sería no perder el tiempo allí.

Es por eso que al comienzo de las pruebas, se muestra esto (ignorar mi sistema de archivos):

    /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 busca una base de datos llamada "postgres" en el host especificado en sus DATABASES configuración, aquí es donde ejecuta las consultas para crear y eliminar su base de datos de prueba. (Nota:Django no necesita que la base de datos "postgres" se especifique explícitamente en su configuración, simplemente la busca en cualquier servidor de base de datos especificado en su configuración).

Parece que si esta base de datos "postgres" no existe, Django puede crear la base de datos de prueba y ejecutar las pruebas, pero no puede eliminar la base de datos de prueba. Esto puede deberse a que Postgres no le permite descartar la base de datos a la que está conectado actualmente, sin embargo, me parece que no hay ninguna razón por la que Django no pueda simplemente eliminar la base de datos de prueba de la base de datos "predeterminada" (producción) especificada en la configuración. Supongo que está usando la base de datos "predeterminada" para crear la base de datos de prueba, por lo que parece que no hay ninguna razón por la que no pueda eliminarla también.

Independientemente, la solución fue simplemente crear esa base de datos "postgres" con una declaración SQL simple:CREATE DATABASE postgres . Después de que se creó esa base de datos, todo funcionó bien.