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

Posted

技术标签:

【中文标题】用于创建数据库、运行测试的 Django / postgres 设置【英文标题】:Django / postgres setup for database creation, for running tests 【发布时间】:2016-01-18 19:23:47 【问题描述】:

我的单元测试是从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 用来连接应用程序数据库的用户不需要(并且不应该)拥有数据库创建权限。 所有这些描述在哪里?我找到的最接近的是here(TEST 配置参数中的TEST 键),但这些设置主要是指Oracle 数据库,并且有不同的用途。

【问题讨论】:

Django 将使用same connection settings as in your settings.py 进行测试,但将使用不同的数据库(默认为test_mydb)。在我对this question 的回答中,我给出了如何向用户添加 createdb 权限的说明。不知道能不能限制权限让django用户只能创建数据库test_mydb @Alasdair:这对我来说有点令人惊讶,但它确实有效。如果你愿意回复,我会接受你的回答。 django test app error - Got an error creating the test database: permission denied to create database的可能重复 【参考方案1】:

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

【讨论】:

【参考方案2】:

截至 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> 连接或创建一个数据库。您还可以在 DATABASE 设置中使用 TEST dict 自定义测试数据库的名称。

【讨论】:

【参考方案3】:

对于生产,我在执行接受的答案解决方案时遇到了错误。 像这样的:

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

【讨论】:

以上是关于用于创建数据库、运行测试的 Django / postgres 设置的主要内容,如果未能解决你的问题,请参考以下文章

创建测试数据库时出错 - django、docker、mysql

带有加载夹具的 Django 单元测试,用于解决几个相关的应用程序问题

每次运行时都没有创建测试数据库的 Django 单元测试

Django:在运行单元测试之前创建测试表时“无法添加外键约束”

Django:如何动态创建模型仅用于测试

如何在 Heroku 上运行 Django 测试