我正在开发一个 django 项目,我所有的单元测试用例都运行良好。
一旦我引入了第二个数据库,我从 TestCase 继承的所有测试用例都被破坏了。在这个阶段,我还没有为第二个数据库构建任何测试用例,但我的路由器工作正常。
当我运行测试时,我得到了错误,
“KeyError:'SUPPORTS_TRANSACTIONS'”
在我看来,这是试图检查我设置的所有数据库是否支持事务,但从未创建第二个数据库。
关于如何让测试脚本构建第二个数据库的任何想法。
我正在开发一个 django 项目,我所有的单元测试用例都运行良好。
一旦我引入了第二个数据库,我从 TestCase 继承的所有测试用例都被破坏了。在这个阶段,我还没有为第二个数据库构建任何测试用例,但我的路由器工作正常。
当我运行测试时,我得到了错误,
“KeyError:'SUPPORTS_TRANSACTIONS'”
在我看来,这是试图检查我设置的所有数据库是否支持事务,但从未创建第二个数据库。
关于如何让测试脚本构建第二个数据库的任何想法。
我意识到这是一个相当古老的线程,但我遇到了同样的问题,我的解决方案是将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 的文档中找不到这个,所以没有链接
是的,我遇到了类似的问题...我的解决方法是为设置文件中的每个数据库连接设置 'SUPPORTS_TRANSACTIONS': True 。不确定这是否是修复它的正确方法,但它对我有用。
'SUPPORTS_TRANSACTIONS':True 也对我有用。但是,我使用数据库路由器进行了一种奇怪的多数据库设置。@user298404:您的多数据库设置如何?
附言。对不起; 没有足够的积分来评论...
这是我目前在生产中使用的多数据库设置:
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'
我希望这有帮助!
参考该链接 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