PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

O Django não pode descartar o banco de dados:psycopg2.OperationalError:não pode descartar o banco de dados atualmente aberto

TL;DR


Se você quer apenas a solução, aqui está. Certifique-se de que seu servidor Postgres tenha um banco de dados "postgres". Você pode verificar conectando-se via psql , e executando /list ou /l . Você pode criar o banco de dados executando:CREATE DATABASE postgres em psql.

Estendido


O Django prefere não executar "consultas de inicialização" (presumivelmente coisas como criar o banco de dados de teste) do banco de dados "default" especificado em seu DATABASES contexto. Presume-se que este seja o banco de dados de produção, então seria do interesse do Django não mexer lá.

É por isso que no início dos testes, isso é mostrado (ignore meu sistema de arquivos):
    /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

O Django procura um banco de dados chamado "postgres" no host especificado em seu DATABASES settings, é aqui que ele executa as consultas para criar e excluir seu banco de dados de teste. (Nota:o Django não precisa que o banco de dados "postgres" seja explicitamente especificado em suas configurações, ele apenas o procura em qualquer servidor de banco de dados especificado em suas configurações).

Parece que se este banco de dados "postgres" não existir, o Django pode criar o banco de dados de teste e executar os testes, mas não pode deletar o banco de dados de teste. Isso pode ser porque o Postgres não permite que você elimine o banco de dados ao qual você está conectado atualmente, no entanto, para mim, parece que não há razão para que o Django não possa simplesmente descartar o banco de dados de teste do banco de dados "padrão" (produção) especificado em as configurações. Presumo que esteja usando o banco de dados "padrão" para criar o banco de dados de teste, então parece que não há razão para que ele não possa excluí-lo também.

Independentemente disso, a solução foi apenas criar esse banco de dados "postgres" com uma instrução SQL simples:CREATE DATABASE postgres . Depois que esse banco de dados foi criado, tudo funcionou bem.