我的单元测试从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可以连接。
我有两个问题:
TEST
配置参数中的here(DATABASES
键),但这些设置主要是指Oracle数据库,并且有不同的用途。答案 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