2010-11-12 164 views
3

我正在研究一个django项目,其中所有的单元测试用例都完美运行。django单元测试多个数据库

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

当我跑我得到错误的测试,

“KeyError异常:‘SUPPORTS_TRANSACTIONS’”

这在我看来,试图检查所有的,我已经得到安装支持的数据库事务,但第二个数据库从不创建。

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

回答

3

是的,我有一个类似的问题......我的修补程序是设置'SUPPORTS_TRANSACTIONS':对于设置文件中的每个数据库连接均为True。不知道这是否是解决问题的正确方法,但它对我有用。

+0

这对我没有帮助。 – pranjal 2011-03-10 12:13:26

+0

适合我。编辑我的设置/ local.py,并添加“'SUPPORTS_TRANSACTIONS':True,”我的DATABASES字典中的单个'默认'条目。 – 2011-07-04 19:46:55

0

'SUPPORTS_TRANSACTIONS':真的对我也有效。 但是我有一种奇怪的多数据库设置使用数据库路由器。 @ 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 ='默认'

我希望这有助于!

2

我意识到这是一个相当古老的线程,但我遇到了它与同样的问题,我的决心是加入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(或回滚,如果他们支持事务处理)

我也正在使用DB路由器

恐怕我无法在Django的文档中找到这个,所以没有链接。

+0

Django文档:https://docs.djangoproject.com/en/2.0/topics/testing/tools/#multi-database-support – pymen 2017-12-22 09:35:21