用于数据库创建的Django / postgres设置,用于运行测试

时间:2015-10-20 08:19:08

标签: python django unit-testing

我的单元测试从django.test.TestCase延伸。使用SQLite3后端,它们运行正常。

我想用PostgreSQL后端运行它们,测试所做的第一件事就是尝试创建一个测试数据库。这失败了,因为django无权执行此操作。我想配置PostgreSQL / django以便允许此操作,但我找不到任何关于如何执行此操作的文档。

这些是用于连接到数据库(settings.py)的设置:

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

运行django应用程序时,我总是有一个预先创建的数据库和用户,因此django可以连接。

我有两个问题:

  • 在单元测试期间,用于创建数据库的连接设置是什么?我的理解是,django用来连接应用程序数据库的用户不需要(并且应该不具备)数据库创建权。
  • 这一切在哪里描述?我发现的最接近的是TEST配置参数中的hereDATABASES键),但这些设置主要是指Oracle数据库,并且有不同的用途。

3 个答案:

答案 0 :(得分:8)

Django将使用the same connection settings as in your settings.py进行测试,但会使用不同的数据库(默认情况下,test_mydb,常规数据库为mydb)。

您可以更改django用户权限以在psql shell中创建数据库。有关详细信息,请参阅this related answer

=> ALTER USER myuser CREATEDB;

我不知道是否可以限制权限,以便django用户只能创建数据库test_mydb

答案 1 :(得分:1)

从2020年开始,让Django能够创建其他答案的数据库的一个更好的选择就是在运行测试时使用--keepdb标志:

$ ./manage.py test --keepdb

这将在两次运行之间保持相同的数据库,这要快得多,并且不需要授予Django用户CREATEDB的权限。 More details here

正如@Alasdair先前指出的那样,Django将use the same settings as your normal database by default,但尝试在test_<your-database-name>连接或创建数据库。您还可以在TEST设置中使用DATABASE dict自定义测试数据库的名称。

答案 2 :(得分:0)

对于生产而言,我在执行公认的答案解决方案时遇到错误。 像这样:

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

对我来说,according to this link,我需要做:

ALTER USER <your_user> CREATEDB;
CREATE DATABASE postgres;

该测试必须为postgres才能正常运行而无需提高 django.db.utils.OperationalError