Разные базы данных для разных приложений в Django - программирование
Подтвердить что ты не робот

Разные базы данных для разных приложений в Django

У меня есть несколько приложений на моем сайте Django: сайт, блог и учебные пособия.

Могу ли я использовать разные базы данных (например, PostgreSQL, MySQL) в разных приложениях Django?

4b9b3361

Ответ 1

Вот что вам нужно сделать, чтобы начать.

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'
}

2) Для каждой базы данных внедрите маршрутизатор базы данных, который будет правильно направлять запросы. В вашем случае реализуйте в каждом приложении. Обратите внимание, это более или менее взято из документации Django.

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

3) Обновите DATABASE_ROUTERS в settings.py

settings.py

DATABASE_ROUTERS = ['app1.dbRouter.App1DBRouter', 'app2.dbRouter.App2DBRouter']

Примечание для людей, которые используют Python 3

заявления как

        if not settings.DATABASES.has_key('db_app1'):

должен стать

        if 'db_app1' not in settings.DATABASES: