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 【问题描述】:

我的测试有问题。这是我第一次编写测试,我遇到了一个问题。

我刚刚在我的应用程序userstest_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”已存在

加载夹具时 django unittest 出错

Django:为啥我在运行 LiveServerTestCase 测试时无法获得回溯(以防出错)?

每次运行时都没有创建测试数据库的 Django 单元测试

搭建Django测试环境时如何创建外部数据库?

django 测试期间数据库创建失败