我有一个特殊的情况,我需要针对一个数据库运行某些测试方法,而针对另一个数据库运行其他测试方法,同时保持相同的别名(在给定的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代码,该方法也会失败。
两者都不起作用,我完全不了解此连接对象的工作原理。有任何想法/建议吗?
答案 0 :(得分:1)
这可能对您有用:https://docs.djangoproject.com/en/2.1/topics/db/multi-db/#manually-selecting-a-database
只要将两个数据库都注册到设置文件中,就应该能够使用using()方法将特定的请求路由到任一数据库。