当前位置: 首页 > 知识库问答 >
问题:

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

缪风史
2023-03-14

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

我刚刚在我的应用程序用户中创建了一个测试文件夹,并且test_urls.py用于测试URL。

当我键入:

python manage.py测试用户

它说:

创建别名默认的测试数据库...创建测试数据库时出错:数据库"database_name"已经存在

如果要尝试删除测试数据库“database_name”,请键入“yes”,或键入“no”取消:

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

共有2个答案

管弘
2023-03-14

FWIW,如果您在使用--Kepdb参数时收到这样的警告,例如

python manage.py test --keepdb [appname]

然后这通常意味着客户机的多个实例被实例化,可能每个测试一个。解决方案是为测试类创建一个客户端,并在所有相应的方法中引用它,如下所示:

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

您还可以(未经验证)使用setUpClassclass方法创建静态客户端。

谭修竹
2023-03-14

测试时,Django会创建一个测试数据库来处理,这样您的开发数据库就不会受到污染。错误消息表示Django正在尝试创建一个名为"database_name"的测试数据库,并且该数据库已经存在。您应该检查您正在使用的数据库软件的表,并检查database_name中的内容,它可能是错误创建的。

如果键入“是”,数据库名称将被删除,并且您不太可能恢复数据。所以,首先要试着去理解发生了什么。

您应该在settings.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时,测试将默认使用内存数据库(即,数据库将在内存中创建,完全绕过文件系统!)。DATABASES中的TEST字典提供了许多设置来配置测试数据库。例如,如果要使用不同的库名,请在TEST字典中为DATABASES中的任何给定数据库指定NAME。

 类似资料:
  • 问题内容: 当我尝试使用命令测试任何应用程序时(当我尝试使用使用此命令的结构来部署myproject时,我注意到了该应用程序): 我收到此错误: 命令似乎起作用。我在settings.py中的数据库设置: 问题答案: Django运行测试套件时,在您的情况下,它将创建一个新数据库。具有用户名的postgres用户没有创建数据库的权限,因此出现错误消息。 当您运行或时,Django不会尝试创建数据库

  • 简介 Laravel提供了各种有用的工具,以便更容易地测试数据库驱动的应用程序。 首先, 你可以使用 assertDatabaseHas 辅助函数, 来断言数据库中是否存在与指定条件互相匹配的数据。 例如,如果我们想验证 users 数据表中是否存在 email 值为 sally@example.com的数据, 你可以安装以下方式来测试: public function testDatabase(

  • 问题内容: 现在一段时间以来,我的单元测试花费的时间比预期的长。我已经尝试调试了几次,但是没有成功,因为延迟是在我的测试甚至开始运行之前。这影响了我在远程测试驱动开发附近做任何事情的能力(也许我的期望太高了),所以我想看看我是否可以一劳永逸地解决这个问题。 运行测试时,测试的开始与实际开始之间会有70到80秒的延迟。例如,如果我针对一个小模块运行测试(使用),我得到 1m:21中的大约1m18位于

  • 您好,我尝试在测试前创建数据库schem,但它失败了:/这是我的脚本: 并且当我尝试使用squirell和嵌入式Derby运行该脚本时,它起作用了。 首先,我尝试在类测试之前使用注释@createSchema(“scripts/import.sql”): 接下来尝试使用@applyscriptbefore 第二次我尝试使用脚本: property name=“ScriptStoExecuteBef

  • 如何让Spring Boot在测试类之间从头开始重新创建内存中的测试数据库? 我有几个用和注释的本地集成测试,可以改变数据库状态。我已经用标记了每一个。我期望创建内存数据库的代码将是应用上下文生命周期的一部分,因此在任何后续测试中都应该创建一个新的生命周期。 我可以在日志中看到Flyway正在尝试重新应用迁移,并认为它们已经完成,因为数据库尚未清除。 Spring Boot是否在每个应用上下文之外