sql >> Databasteknik >  >> RDS >> PostgreSQL

Django kan inte släppa databasen:psycopg2.OperationalError:kan inte släppa den för närvarande öppna databasen

TL;DR

Om du bara vill ha lösningen så är den här. Se till att din Postgres-server har en "postgres"-databas. Du kan kontrollera genom att ansluta via psql , och kör /list eller /l . Du kan skapa databasen genom att köra:CREATE DATABASE postgres i psql.

Utökad

Django föredrar att inte köra "initieringsfrågor" (förmodligen saker som att skapa testdatabasen) från "standard"-databasen som anges i dina DATABASES miljö. Detta antas vara produktionsdatabasen, så det skulle ligga i Djangos bästa att inte röra runt där.

Det är därför som detta visas i början av testerna (ignorera mitt filsystem):

    /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 letar efter en databas med namnet "postgres" på den värd som anges i dina DATABASES inställningar, det är här den kör frågorna för att skapa och ta bort din testdatabas. (Obs:Django behöver inte att "postgres"-databasen är explicit specificerad i dina inställningar, den letar bara efter den på vilken databasserver som än är specificerad i dina inställningar).

Det verkar som om denna "postgres"-databas inte existerar kan Django skapa testdatabasen och köra testerna, men den kan inte ta bort testdatabasen. Detta kan bero på att Postgres inte tillåter dig att släppa databasen du för närvarande är ansluten till, men för mig verkar det som att det inte finns någon anledning att Django inte bara kunde släppa testdatabasen från "standard" (produktions)databasen som anges i inställningarna. Jag antar att den använder "standard"-databasen för att skapa testdatabasen, så det verkar inte finnas någon anledning till att den inte kan ta bort den också.

Oavsett så var lösningen bara att skapa den där "postgres"-databasen med en enkel SQL-sats:CREATE DATABASE postgres . Efter att databasen skapats fungerade allt bra.



  1. Analysera I/O-prestanda för SQL Server

  2. SQLalchemy begår inte ändringar vid inställning av roll

  3. MySQL SUM med samma ID

  4. Minnesgränser i SQL Server 2016 SP1