如何在Django TestCase中修改特定测试方法的数据库连接(然后在完成后还原)?

时间:2019-02-01 18:34:39

标签: django python-unittest

我有一个特殊的情况,我需要针对一个数据库运行某些测试方法,而针对另一个数据库运行其他测试方法,同时保持相同的别名(在给定的TestCase中)。

我不是在问多个数据库连接,而是在测试方法中为给定别名更改数据库连接,然后在执行测试方法后将其恢复为默认状态。

我尝试了以下操作(此代码位于我的TestCase中):

from django.db import connections
from django.db.backends.postgresql.base import DatabaseWrapper

def testSwitchDBParamsForAlias(self):
    db_wrapper = DatabaseWrapper(
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'HOST' : 'host',
        'PORT' : '2342',
        'NAME' : 'dbname',
        'USER' : 'user',
        'PASSWORD': 'password'
    )
    connections.__setitem__('dbalias', db_wrapper)
    print(connections._databases) # This still has the old connection

在上面的代码中,'dbAlias'已经存在不同的凭据,并且我正尝试使用 setitem 方法换出凭据。

另一种使用上下文管理器的尝试:

def testSwitchDBParamsUsingCM(self):
    with self.settings(DATABASES = DATABASES):
        # call setup_databases here
        print(connections._databases)  #old credentials printed here

第三种方法:

def testSwitchDB(self):
    connections = ConnectionHandler(LAKE_TEST_DB)
    print(connections._databases)
    response = self.client.get(reverse('my_url'), format='json')

第三种方法实际上将修改连接对象!但是,这仍然不起作用,因为在每个api调用(或视图)中都会再次导入连接对象,并且此更改将被覆盖。因此,如果不修改API代码,该方法也会失败。

两者都不起作用,我完全不了解此连接对象的工作原理。有任何想法/建议吗?

1 个答案:

答案 0 :(得分:1)

这可能对您有用:https://docs.djangoproject.com/en/2.1/topics/db/multi-db/#manually-selecting-a-database

只要将两个数据库都注册到设置文件中,就应该能够使用using()方法将特定的请求路由到任一数据库。