我的Django网站上有多个应用程序:mainsite,博客和教程.
我可以在不同的Django应用程序中使用不同的数据库(例如PostgreSQL,MySQL)吗?
Roh*_*han 28
以下是您需要做的事情.
1)更新要使用的数据库的设置.
settings.py
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': '/var/db/projectdb'
}
'db_app1': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': '/var/db/app1db'
}
'db_app2': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': '/var/db/app2db'
}
Run Code Online (Sandbox Code Playgroud)
2)对于每个数据库,实现一个数据库路由器,它将适当地路由查询.在你的案例中实现每个应用程序.请注意,这或多或少取自django docs.
app1.dbRouter.py
# DB router for app1
class App1DBRouter(object):
"""
A router to control app1 db operations
"""
def db_for_read(self, model, **hints):
"Point all operations on app1 models to 'db_app1'"
from django.conf import settings
if not settings.DATABASES.has_key('db_app1'):
return None
if model._meta.app_label == 'app1':
return 'db_app1'
return None
def db_for_write(self, model, **hints):
"Point all operations on app1 models to 'db_app1'"
from django.conf import settings
if not settings.DATABASES.has_key('db_app1'):
return None
if model._meta.app_label == 'app1':
return 'db_app1'
return None
def allow_relation(self, obj1, obj2, **hints):
"Allow any relation if a model in app1 is involved"
from django.conf import settings
if not settings.DATABASES.has_key('db_app1'):
return None
if obj1._meta.app_label == 'app1' or obj2._meta.app_label == 'app1':
return True
return None
def allow_syncdb(self, db, model):
"Make sure the app1 app only appears on the 'app1' db"
from django.conf import settings
if not settings.DATABASES.has_key('db_app1'):
return None
if db == 'db_app1':
return model._meta.app_label == 'app1'
elif model._meta.app_label == 'app1':
return False
return None
Run Code Online (Sandbox Code Playgroud)
3)DATABASE_ROUTERS在settings.py中更新
settings.py
DATABASE_ROUTERS = ['app1.dbRouter.App1DBRouter', 'app2.dbRouter.App2DBRouter']
Run Code Online (Sandbox Code Playgroud)