我不相信有。您可以将 DATABASES 设置设置为可以更改默认值的自定义类 dict 类,即:
from threading import local
class DatabaseSettings(dict):
def __init__(self, db, *args, **kwargs):
super(DatabaseSettings, self).__init__(*args, **kwargs)
self._default = local()
self._default.db = db
def set_database(self, db):
self._default.db = db
def __getitem__(self, name):
if name == DEFAULT_DB_ALIAS and self._default.db:
name = self._default.db
return super(DatabaseSettings, self).__getitem__(name)
from django.conf import settings
from django.utils import six
from django.db import connections, DEFAULT_DB_ALIAS
class UseDatabase(object):
def __init__(self, db):
self.db = db
def __enter__(self):
settings.DATABASES.set_database(self.db)
conn = getattr(connections._connections, self.db, None)
if conn:
setattr(connections._connections, DEFAULT_DB_ALIAS, conn)
def __exit__(self, exc_type, exc_value, traceback):
settings.DATABASES.set_database(None)
if exc_type:
six.reraise(exc_type, exc_value, traceback)
connections._connections 已经是线程本地的,所以这应该是线程安全的。请仔细检查,因为我远非多线程专家。
现在您可以使用with UseDatabase('<name>'): 指定不同的数据库作为该块的默认值。这不会改变显式使用不同数据库的代码的行为。
这段代码远未完成,但它应该让您开始。确保您实际保存和恢复旧的默认连接,也许支持嵌套上下文管理器是个好主意。