如何选择数据库路由器?我正在使用子域名,如果例如app1.domain.de被路由,我想更改数据库路由器。有人可以帮帮我吗?
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(SITE_ROOT, 'db') + '/default.db',
'USER': '',
'PASSWORD': '',
'HOST': '',
'PORT': '',
},
'app1': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(SITE_ROOT, 'db') + '/app1.db',
'USER': '',
'PASSWORD': '',
'HOST': '',
'PORT': '',
},
'app2': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(SITE_ROOT, 'db') + '/app2.db',
'USER': '',
'PASSWORD': '',
'HOST': '',
'PORT': '',
},
}
DATABASE_ROUTERS = ['app1.routers.DatabaseRouter', 'app2.routers.DatabaseRouter']
/app1/routers.py
class DatabaseRouter(object):
def db_for_read(self, model, **hints):
return "app1"
def db_for_write(self, model, **hints):
return "app1"
/app2/routers.py
class DatabaseRouter(object):
def db_for_read(self, model, **hints):
return "app2"
def db_for_write(self, model, **hints):
return "app2"
答案 0 :(得分:0)
如果数据库路由器持有所请求模型的模型/表,则应返回数据库名称,否则应返回None
。在您的情况下,您的路由器始终返回app1
或app2
,这是不正确的。
以下是我如何使用它的示例:
class AuditDBRouter(object):
"""
A router to controll audit db operations
"""
def db_for_read(self, model, **hints):
"Point all operations on audit models to 'audit'"
from django.conf import settings
#admin do not want separate DB?
if not settings.DATABASES.has_key('audit'):
return None
#return our DB name
if model._meta.app_label == 'audit':
return 'audit'
#we don't serve this.
return None
答案 1 :(得分:0)
我不确定这是否是您想要的,但是您可以通过简单地使用环境变量来实现此功能。
$ export DB_NAME=app1
设置DB_NAME
环境变量后,您可以像这样更改您的settings.py文件以使用此新变量:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(SITE_ROOT, 'db') + '/' + os.environ.get('DB_NAME', 'default') + '.db',
'USER': '',
'PASSWORD': '',
'HOST': '',
'PORT': '',
}
请注意,如果未设置DB_NAME
,则最终将使用default
作为默认值。