Django 多数据库映射
Django multiple database mapping
在 Django 中,当使用多个 DB 如何映射数据库时,例如:请求中有一个参数 app1 映射到 db1,另一个请求 app2 映射到 db2。现在如何在将请求发送到视图之前选择数据库
DATABASE_APPS_MAPPING = {'app1':'db1','app2':'db2'}
DATABASES = {
'default': {
},
'db1': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'hp1',
'USER': 'server',
'PASSWORD': 'hpdata',
'HOST': '192.168.3.11',
'PORT': '3306'
},
'db2': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'hp2',
'USER': 'server',
'PASSWORD': 'hpdata',
'HOST': '192.168.3.11',
'PORT': '3306'
}
}
我不太确定你想做什么。但我猜你会在这里找到答案:
https://docs.djangoproject.com/en/1.8/topics/db/multi-db/#topics-db-multi-db-routing
如果你真的想要select一个基于url(子域e.a)的数据库,那么你将不得不编写一个自定义中间件class:
https://docs.djangoproject.com/en/1.8/topics/http/middleware/
假设我可以导入一个给我数据库的函数:
project/app/views.py:
from .utils import which_db, item_search
from django.shortcuts import render
from .models import SomeModel
def some_view(request):
obj = SomeModel.objects.using(which_db(request)).filter(**item_search(request))
return render(request, "some_model.html", {'object':obj}
每次都必须附加 using 很麻烦。有一种方法可以将类似的查询路由到不同的数据库(详细记录 here)。
project/settings.py:
DATABASE_ROUTERS = ['project.db_routes.AppRouter',]
DB_ROUTING = {'app1':'db1','app2':'db2'}
project/db_routes.py:
from django.conf import settings
class AppRouter:
def __init__(self):
self.DB = settings.DB_ROUTING
def db_for_read(self, model, **hints):
return self.DB.get(self.model.app_label, 'default')
def db_for_write(self, model, **hints):
return self.DB.get(self.model.app_label, 'default')
def allow_relation(self, obj1, obj2, **hints):
return True
def allow_migrate(self, db, app_label, model=None, **hints):
return self.DB.get(app_label, None)
我假设您希望能够在数据库之间使用外键。如果不是,return 来自 allow_relation 的错误。 allow_migrate 确保对象仅存在于其正确的数据库中。
我没有测试过这个解决方案,但它确实符合文档。
在 Django 中,当使用多个 DB 如何映射数据库时,例如:请求中有一个参数 app1 映射到 db1,另一个请求 app2 映射到 db2。现在如何在将请求发送到视图之前选择数据库
DATABASE_APPS_MAPPING = {'app1':'db1','app2':'db2'}
DATABASES = {
'default': {
},
'db1': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'hp1',
'USER': 'server',
'PASSWORD': 'hpdata',
'HOST': '192.168.3.11',
'PORT': '3306'
},
'db2': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'hp2',
'USER': 'server',
'PASSWORD': 'hpdata',
'HOST': '192.168.3.11',
'PORT': '3306'
}
}
我不太确定你想做什么。但我猜你会在这里找到答案:
https://docs.djangoproject.com/en/1.8/topics/db/multi-db/#topics-db-multi-db-routing
如果你真的想要select一个基于url(子域e.a)的数据库,那么你将不得不编写一个自定义中间件class:
https://docs.djangoproject.com/en/1.8/topics/http/middleware/
假设我可以导入一个给我数据库的函数:
project/app/views.py:
from .utils import which_db, item_search
from django.shortcuts import render
from .models import SomeModel
def some_view(request):
obj = SomeModel.objects.using(which_db(request)).filter(**item_search(request))
return render(request, "some_model.html", {'object':obj}
每次都必须附加 using 很麻烦。有一种方法可以将类似的查询路由到不同的数据库(详细记录 here)。
project/settings.py:
DATABASE_ROUTERS = ['project.db_routes.AppRouter',]
DB_ROUTING = {'app1':'db1','app2':'db2'}
project/db_routes.py:
from django.conf import settings
class AppRouter:
def __init__(self):
self.DB = settings.DB_ROUTING
def db_for_read(self, model, **hints):
return self.DB.get(self.model.app_label, 'default')
def db_for_write(self, model, **hints):
return self.DB.get(self.model.app_label, 'default')
def allow_relation(self, obj1, obj2, **hints):
return True
def allow_migrate(self, db, app_label, model=None, **hints):
return self.DB.get(app_label, None)
我假设您希望能够在数据库之间使用外键。如果不是,return 来自 allow_relation 的错误。 allow_migrate 确保对象仅存在于其正确的数据库中。
我没有测试过这个解决方案,但它确实符合文档。