【问题标题】:Django testing: Got an error creating the test database: database "database_name" already existsDjango 测试:创建测试数据库时出错:数据库“database_name”已存在
【发布时间】:2019-09-05 05:00:47
【问题描述】:
我的测试有问题。这是我第一次编写测试,我遇到了一个问题。
我刚刚在我的应用程序users 和test_urls.py 中创建了一个测试文件夹来测试网址。
当我输入时:
python manage.py test users
上面写着:
为别名“默认”创建测试数据库...创建时出错
测试数据库:数据库“database_name”已经存在
如果您想尝试删除测试数据库,请输入“是”
'database_name' 或 'no' 取消:
这是什么意思?如果我输入 yes 会发生什么?我会丢失数据库中的所有数据吗?
【问题讨论】:
标签:
python
django
database
postgresql
【解决方案1】:
FWIW,如果您在使用 --keepdb 参数时收到此类警告,例如
python manage.py test --keepdb [appname]
那么这通常意味着Client 的多个实例被实例化,可能每个测试一个。解决方案是为测试类创建一个客户端,并在所有相应的方法中引用它,如下所示:
from djanog.test import TestCase, Client
class MyTest(TestCase):
def setUp(self):
self.client = Client()
def test_one(self):
response = self.client.get('/path/one/')
# assertions
def test_two(self):
response = self.client.post('/path/two/', {'some': 'data'})
# assertions
您还可以(未经验证)使用setUpClass 类方法创建静态客户端。
【解决方案2】:
在测试时,Django 会创建一个测试数据库来处理,这样您的开发数据库就不会受到污染。错误消息说 Django 正在尝试创建一个名为 "database_name" 的测试数据库,并且该数据库已经存在。您应该检查您正在使用的数据库软件的表,并检查database_name中的内容,它可能是错误创建的。
如果您键入 yes,数据库 database_name 将被删除,并且您不太可能能够恢复数据。因此,请先尝试了解发生了什么。
您应该在settings.py 中设置测试数据库的名称。在DATABASE 设置中有一个特定的TEST dictionary:
settings.py
...
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'USER': 'mydatabaseuser',
'NAME': 'mydatabase',
'TEST': {
'NAME': 'mytestdatabase',
},
},
}
...
默认情况下,前缀test_ 会添加到您的开发数据库的名称中。您应该检查您的settings.py 以了解发生了什么。
来自docs:
默认测试数据库名称是通过在DATABASES 中的每个NAME 的值前添加test_ 来创建的。使用 SQLite 时,测试将默认使用内存数据库(即,数据库将在内存中创建,完全绕过文件系统!)。 DATABASES 中的 TEST 字典提供了许多设置来配置您的测试数据库。例如,如果您想使用不同的数据库名称,请在 TEST 字典中为 DATABASES 中的任何给定数据库指定 NAME。