Django中不同应用程序的不同数据库

Ran*_*ngh 20 python django

我的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)

  • app1.dbRouter.py 位于哪里?在应用层面?或者在项目层面? (3认同)
  • 对于 app1 和 app2 路由器未捕获的模型,这是否仍将使用默认数据库? (2认同)
  • 从文档中,“如果您将默认数据库留空,并且不想定义一个包罗万象的数据库路由器来处理所有未另行指定的应用程序,则您的路由器必须在迁移之前处理 INSTALLED_APPS 中所有应用程序的名称。”( https://docs.djangoproject.com/en/3.0/topics/db/multi-db/#using-routers)。我倾向于这么认为@RickWestera。 (2认同)