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

19

我在测试方面遇到了问题。这是我第一次编写测试,我遇到了问题。

我刚刚在我的应用程序users中创建了一个名为test_urls.py的测试文件夹,用于测试urls。

当我输入:

python manage.py test users

它会显示如下信息:

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

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

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


相关链接:https://dev59.com/IKfja4cB1Zd3GeqPpASU - djvg
相关链接:https://stackoverflow.com/q/47466185 - undefined
2个回答

25
在测试时,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 以了解详情。
来自文档
引用:

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


如果我正在使用连接字符串,例如'default': 'postgres://user:password@localhost:5432/db',我该如何指定测试? - KhoPhi
@KhoPhi 最后的 db 是数据库的名称。 - Jacques Gaudin

1

如果您在使用--keepdb参数时收到这样的警告,那么就需要注意了。

python manage.py test --keepdb [appname]

如果出现这种情况,通常意味着实例化了多个Client,可能是每个测试一个。解决方法是为测试类创建一个客户端,并在所有相关的方法中引用它,如下所示:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接