用django管理一个应用程序的不同数据库



我理解如何通过路由器处理几个数据库,但是,当我有两个具有相同结构的数据库,但需要根据用户在开始会话时选择的数据库保存信息时,该如何处理呢?我有一个会话登录与其相应的用户名和密码,除了它是强制性的,用户选择一个数据库通过选择器启动会话到应用程序正确,这一信息所选择的数据库的名称是移动通过一个会话cookie为整个会话(原谅冗余),应用程序的所有操作必须在数据库上完成,最初选择在访问登录。如何正确地为这种情况路由数据库?

DATABASES = {
'default' : {
'ENGINE': 'django.db.backends.mysql',
'NAME': env.str('NAME_DB_ZF'),
'USER': env.str('USER_DB'),
'PASSWORD': env.str('PASS_DB'),
'HOST': 'localhost',
'PORT': '3306',
},
'SBOJOZF': {
'ENGINE': 'django.db.backends.mysql',
'NAME': env.str('NAME_DB_ZF'),
'USER': env.str('USER_DB'),
'PASSWORD': env.str('PASS_DB'),
'HOST': 'localhost',
'PORT': '3306',
},
'SBOJOCOL': {
'ENGINE': 'django.db.backends.mysql',
'NAME': env.str('NAME_DB_COL'),
'USER': env.str('USER_DB'),
'PASSWORD': env.str('PASS_DB'),       
'HOST': 'localhost',
'PORT': '3306',
}
}

我将假设您正在询问路由到多个数据库,如果这不是您的问题,请原谅我。我认为你需要的是一个转换器。

在你的urls.py:

from django.urls import path, register_converter
register_converter(convertors.DatabaseNameConverter, 'db_name')
urlpatterns = [
path('<db_name:db_name>/', views.example_view),
]

则在convertors.py中:

from django.conf import settings

class DatabaseNameConverter:
"""
Regex converter for URL that takes all available names of databases for routing.
"""
regex = '('+')|('.join(settings.DATABASES.keys())+')'
def to_python(self, value):
return str(value)
def to_url(self, value):
return str(value)

这只是一个可以在视图中使用的查询参数,下面是一个示例视图:

def example_view(request, db_name):
users = User.objects.using(db_name).all()
# Other code

或者你可以检查你正在使用的数据库知道如何查询:db_name == "default"

delete示例:

instance = User.objects.using(db_name).get(id=id)
instance.delete()

最新更新