blueFast
blueFast

Reputation: 44331

Django / postgres setup for database creation, for running tests

My unittests are extending from django.test.TestCase. Using an SQLite3 backend, they are running fine.

I want to run them with a PostgreSQL backend, and the first thing that the tests are doing is to try and create a test database. This fails, since django has no permissions to do this. I want to configure PostgreSQL / django so that this operation is allowed, but I can not find any documentation on how to do this.

These are the settings used to connect to the database (settings.py):

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'mydb',
        'USER': 'myuser',
        'PASSWORD': 'myppasss',
        'HOST': 'localhost',
        'PORT': '',
    }
}

When running the django application, I have always a pre-created database and user, so that django can connect.

I have two questions:

Upvotes: 15

Views: 15179

Answers (3)

Matt Sanders
Matt Sanders

Reputation: 10685

As of 2020 a superior option to giving Django the ability to create databases per other answers is just to use the --keepdb flag when running your tests:

$ ./manage.py test --keepdb

This will keep the same db around between runs, which is much faster and doesn't require giving your django user CREATEDB permissions. More details here.

As @Alasdair previously noted, Django will use the same settings as your normal database by default but attempt to connect to or create a db at test_<your-database-name>. You can also customize the test DB's name with the TEST dict in your DATABASE settings.

Upvotes: 4

rahmatnazali
rahmatnazali

Reputation: 180

For production, I faced error when executing the accepted answer solution. Something like this:

django.db.utils.OperationalError: cannot drop the currently open database

For me, according to this link, I need to do:

ALTER USER <your_user> CREATEDB;
CREATE DATABASE postgres;

It needs to be postgres for the test to work without raising django.db.utils.OperationalError

Upvotes: 0

Alasdair
Alasdair

Reputation: 308779

Django will use the same connection settings as in your settings.py for tests, but will use a different database (by default, test_mydb where your regular database is mydb).

You can change the django user permissions to create databases in the psql shell. See this related answer for more info.

=> ALTER USER myuser CREATEDB;

I don't know whether it's possible to restrict the permission so that the django user can only create the database test_mydb.

Upvotes: 18

Related Questions