Django 测试:创建测试数据库时出错:数据库“database_name”已存在
Posted
技术标签:
【中文标题】Django 测试:创建测试数据库时出错:数据库“database_name”已存在【英文标题】:Django testing: Got an error creating the test database: database "database_name" already exists 【发布时间】:2019-09-05 05:00:47 【问题描述】:我的测试有问题。这是我第一次编写测试,我遇到了一个问题。
我刚刚在我的应用程序users
和test_urls.py
中创建了一个测试文件夹来测试网址。
当我输入时:
python manage.py test users
上面写着:
为别名“默认”创建测试数据库...创建时出错 测试数据库:数据库“database_name”已经存在
如果您想尝试删除测试数据库,请输入“是” 'database_name' 或 'no' 取消:
这是什么意思?如果我输入 yes 会发生什么?我会丢失数据库中的所有数据吗?
【问题讨论】:
【参考方案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。
【讨论】:
以上是关于Django 测试:创建测试数据库时出错:数据库“database_name”已存在的主要内容,如果未能解决你的问题,请参考以下文章
Django 测试:创建测试数据库时出错:数据库“database_name”已存在