用于创建数据库、运行测试的 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 单元测试,用于解决几个相关的应用程序问题