繁体   English   中英

Django 测试:创建测试数据库时出错:数据库“database_name”已经存在

[英]Django testing: Got an error creating the test database: database "database_name" already exists

我有测试问题。 这是我第一次写测试,我有一个问题。

我刚刚在我的应用程序users创建了一个 test 文件夹,并在test_urls.py创建了一个用于测试 url 的文件夹。

当我输入:

python manage.py test users

它说:

为别名“default”创建测试数据库...创建测试数据库时出错:数据库“database_name”已经存在

如果您想尝试删除测试数据库“database_name”,请输入“yes”,或者输入“no”取消:

这是什么意思? 如果我输入 yes 会发生什么? 我会丢失数据库中的所有数据吗?

在测试时,Django会创建一个测试数据库,以便您的开发数据库不会受到污染。 错误消息显示Django正在尝试创建名为"database_name"的测试数据库,并且该数据库已存在。 您应该检查您正在使用的数据库软件的表并检查database_name ,它可能是错误地创建的。

如果键入yes,则将删除数据库database_name并且您不太可能恢复数据 因此,首先要了解发生了什么。

您应该在settings.pysettings.py测试数据库的名称。 DATABASE设置中有一个特定的TEST字典

settings.py

...
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'USER': 'mydatabaseuser',
        'NAME': 'mydatabase',
        'TEST': {
            'NAME': 'mytestdatabase',
        },
    },
}
...

默认情况下,前缀test_将添加到开发数据库的名称中。 你应该检查你的settings.py来检查发生了什么。

来自文档

通过将test_预先添加到DATABASES中每个NAME的值来创建默认测试数据库名称。 使用SQLite时,默认情况下测试将使用内存数据库(即数据库将在内存中创建,完全绕过文件系统!)。 DATABASESTEST字典提供了许多配置测试数据库的设置。 例如,如果要使用其他数据库名称,请在TEST字典中为DATABASES任何给定数据库指定NAME。

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类方法创建静态客户端。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM