7

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

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

当我运行测试时,我得到了错误,

“KeyError:'SUPPORTS_TRANSACTIONS'”

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

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

4

5 回答 5

9

我意识到这是一个相当古老的线程,但我遇到了同样的问题,我的解决方案是将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 的文档中找不到这个,所以没有链接

于 2016-09-18T07:53:53.307 回答
3

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

于 2010-12-16T04:29:12.530 回答
1

'SUPPORTS_TRANSACTIONS':True 也对我有用。但是,我使用数据库路由器进行了一种奇怪的多数据库设置。@user298404:您的多数据库设置如何?

附言。对不起; 没有足够的积分来评论...

于 2011-03-21T08:54:14.363 回答
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='default'

我希望这有帮助!

于 2011-04-14T23:53:55.103 回答
0

参考该链接 Django doc Multi-Db 您可以:

from django.test import TransactionTestCase

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

    def test_index_page_view(self):
        call_some_test_code()

谢谢

@sih4sing5hog5

于 2022-01-05T22:04:29.437 回答