django 在多个数据库上进行单元测试

问题描述 投票:0回答:5

我正在开发一个 Django 项目,其中我的所有单元测试用例都运行良好。

当我引入第二个数据库时,所有从 TestCase 继承的测试用例都被破坏了。在这个阶段,我还没有为第二个数据库构建任何测试用例,但我的路由器工作正常。

当我运行测试时,出现错误,

“密钥错误:'SUPPORTS_TRANSACTIONS'”

在我看来,正在尝试检查我设置的所有数据库是否都支持事务,但第二个数据库从未创建。

关于如何使用测试脚本构建第二个数据库的任何想法。

django multiple-databases
5个回答
10
投票

我意识到这是一个相当老的线程,但我遇到了同样的问题,我的解决方案是将

multi_db = True
标志添加到我的测试用例中,例如:

class TestThingWithMultipleDatabases(TestCase):
     multi_db = True

     def test_thing(self):
         pass

来源https://github.com/django/django/blob/master/django/test/testcases.py#L861

这会导致 django 在所有数据库上调用

flush
(如果支持事务则回滚)

我也在使用数据库路由器

恐怕我在 Django 文档中找不到这个,所以没有链接


4
投票

是的,我遇到了类似的问题...我的解决方法是设置 'SUPPORTS_TRANSACTIONS': True 对于设置文件中的每个数据库连接。不确定这是否是修复它的正确方法,但它对我有用。


2
投票

参考该链接 Django 文档多数据库 你可以:

from django.test import TransactionTestCase

class TestMyViews(TransactionTestCase):
    databases = {'default', 'other'} # '__all__' should work too

    def test_index_page_view(self):
        call_some_test_code()

感谢

@sih4sing5hog5


1
投票

'SUPPORTS_TRANSACTIONS':True 也对我有用。 然而,我有一种使用数据库路由器的奇怪的多数据库设置。 @user298404:你的多数据库设置是什么样的?

ps。对不起;积分不够,无法发表评论...


0
投票

这是我目前在生产中使用的多数据库设置:

DATABASES = {
    # 'default' is used as the WRITE (master) connection
    DB_PRIMARY_MASTER: {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'main',
        'USER': 'main_write',
        'PASSWORD': 'XXXX',
        'HOST': 'db-master',
        'PORT': '3306',
        'SUPPORTS_TRANSACTIONS': True,
    },

    # Slave connections are READONLY
    DB_PRIMARY_SLAVE: {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'main',
        'USER': 'main_read',
        'PASSWORD': 'XXXX',
        'HOST': 'db-slave',
        'PORT': '3306',
        'TEST_MIRROR': DB_PRIMARY_MASTER,
        'SUPPORTS_TRANSACTIONS': True,
    },

    # 'mail_default' is used as the WRITE (master) connection for the mail database
    DB_MAIL_MASTER: {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'dbmail',
        'USER': 'dbmail_write',
        'PASSWORD': 'XXXX',
        'HOST': 'db-mail-master',
        'PORT': '3306',
        'SUPPORTS_TRANSACTIONS': True,
    },

    # Slave connections are READONLY
    DB_MAIL_SLAVE: {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'dbmail',
        'USER': 'dbmail_read',
        'PASSWORD': 'XXXX',
        'HOST': 'db-mail-slave',
        'PORT': '3306',
        'TEST_MIRROR': DB_MAIL_MASTER,
        'SUPPORTS_TRANSACTIONS': True,
    },
}

DB_PRIMARY_MASTER、DB_PRIMARY_SLAVE、DB_MAIL_MASTER 和 DB_MAIL_SLAVE 都是字符串常量,因此它们可以在我的数据库路由器中使用。
提示:DB_PRIMARY_MASTER='默认'

我希望这有帮助!

© www.soinside.com 2019 - 2024. All rights reserved.