Создание роутеров для нескольких баз данных в Джанго - PullRequest
0 голосов
/ 13 мая 2019

Я разрабатываю приложение Django, в котором мне нужно несколько баз данных, по одной для каждого пользователя системы. Для этого я определил базы данных так:


DATABASES = {
    'default': {},
    'primary': {
        'NAME': 'primary',
        'ENGINE': 'django.db.backends.mysql',
        'USER': 'mysql_user',
        'PASSWORD': 'pass',
    },
    'user1': {
        'NAME': 'user1',
        'ENGINE': 'django.db.backends.mysql',
        'USER': 'mysql_user',
        'PASSWORD': 'pass',
    },
    'user2': {
        'NAME': 'user2',
        'ENGINE': 'django.db.backends.mysql',
        'USER': 'mysql_user',
        'PASSWORD': 'pass',
    },
}

, в которой базы данных user1 и user2 являются репликами структуры primary.

Допустим, я создал двух суперпользователей с логинами 'superuser1' и 'superuser2'. Как мне определить, что, когда 'superuser1' регистрируется, данные изменяются в базе данных 'user1', а когда 'superuser2' регистрируется, данные в базе данных 'user2' изменяются?

1 Ответ

0 голосов
/ 14 мая 2019

Эта логика, вероятно, будет распространяться на все ваше приложение.По сути, вам нужно создать функцию, которая будет принимать пользовательский экземпляр, а затем возвращать строку, которая будет отображаться в базе данных:

DATABASE_USER_MAP = {
    'username1': 'user1',
}

def get_database(user):
    return settings.DATABASE_USER_MAP.get(user.username, 'default')

def some_view(request):
    data = Data.objects.using(get_database(request.user)).all()
    ...

Как только вы получите что-то подобное, вы можете переместить базу данных, определяющую логикув промежуточное ПО и установите его на request, чтобы вы могли сделать:

def some_view(request):
    data = Data.objects.using(request.db).all()
    ...

Основная проблема заключается в том, что по умолчанию он будет primary, а не из-за ошибки, заставляя вас быть дотошным при написаниизапросы.

Еще один путь, который вы, возможно, захотите продолжить, - погрузиться в кодовую базу Django, чтобы увидеть, как работает маршрутизатор базы данных и можно ли отправить запрос в качестве подсказки маршрутизатору.Я ничего не знаю об этом, поэтому я не знаю, возможно ли это.Однако, если бы это было возможно, это сняло бы беспокойство, которое я поднял.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...