Нужна помощь в настройке маршрутизатора базы данных для нескольких баз данных mysql - PullRequest
0 голосов
/ 23 марта 2020

Я создал проект, в котором есть две идентичные модели для работы на дому (wfh) и на работе (wfo). Я хочу, чтобы данные сотрудника были сохранены в базе данных wfh, а данные wfo - в базе данных wfo. Используемая база данных: mysql.

Однако у меня возникают следующие проблемы:

1) Миграция завершается с ошибкой: в методе allow_migrate () в Router_name.py имя-модели получило несколько значений. Поэтому мне пришлось заменить метод allow_migrate () на allow_syncdb (), который избавился от ошибок и были применены миграции.

2) таблицы не создаются, даже если миграции успешны для всех баз данных. Python оболочка не может добавить новые записи сотрудников в базу данных (ошибка таблицы не существует)

3) Создание суперпользователя после ввода только имени пользователя выдает исключение для неправильно настроенной базы данных

4 ) суперпользователь, созданный ранее (сразу после создания проекта) при попытке входа в систему из панели администратора, выдает неверные учетные данные

Структура проекта

Project Folder
 |
 +--env
 |
 +--multi_db
    |
    +--basic_app
    |  |
    |  +--AuthRouter.py
    |  +--DbRouter.py
    |  +--models.py
    |
    +--multi_db
    |  |
    |  +--settings.py
    |
    +--manage.py

settings.py

DATABASES = {
    'default': {},
    'auth_db': {
        'NAME': 'auth_db',
        'ENGINE': 'django.db.backends.mysql',
        'HOST': '127.0.0.1',
        'PORT': '3306',
        'USER': '***',
        'PASSWORD': '***',
        # connect options
        'OPTIONS': {'init_command': "SET sql_mode='STRICT_TRANS_TABLES'", },
    },
    'work_from_home':{
        'ENGINE': 'django.db.backends.mysql',
        'HOST': '127.0.0.1',
        'PORT': '3306',
        'NAME': 'wfh',
        'USER': '***',
        'PASSWORD': '***',
        # connect options
        'OPTIONS': {'init_command': "SET sql_mode='STRICT_TRANS_TABLES'",},
    },
    'work_from_office':{
        'ENGINE': 'django.db.backends.mysql',
        'HOST': '127.0.0.1',
        'PORT': '3306',
        'NAME': 'wfo',
        'USER': '***',
        'PASSWORD': '***',
        # connect options
        'OPTIONS': {'init_command': "SET sql_mode='STRICT_TRANS_TABLES'",},
    }
}

DATABASE_ROUTERS = ['basic_app.AuthRouter.AuthRouter','basic_app.DbRouter.DatabaseAppsRouter']
DATABASE_APPS_MAPPING = {'wfh_employees': 'work_from_home', 'wfo_employees': 'work_from_office'}

models.py

from django.db import models

# Create your models here.
class WfhEmployee(models.Model):
    employee_id = models.PositiveIntegerField(primary_key=True, auto_created=True)
    name = models.CharField(max_length=100)
    email = models.EmailField(max_length=100)
    post = models.CharField(max_length=100)
    department = models.CharField(max_length=100)
    def __str__(self):
        return self.name
    class Meta:
        app_label = 'wfh_employees'


class WfoEmployee(models.Model):
    employee_id = models.PositiveIntegerField(primary_key=True, auto_created=True)
    name = models.CharField(max_length=100)
    email = models.EmailField(max_length=100)
    post = models.CharField(max_length=100)
    department = models.CharField(max_length=100)
    def __str__(self):
        return self.name
    class Meta:
        app_label = 'wfo_employees'

AuthRouter.py

class AuthRouter:
    """
    A router to control all database operations on models in the
    auth and contenttypes applications.
    """
    route_app_labels = {'auth', 'contenttypes'}

    def db_for_read(self, model, **hints):
        """
        Attempts to read auth and contenttypes models go to auth_db.
        """
        if model._meta.app_label in self.route_app_labels:
            return 'auth_db'
        return None

    def db_for_write(self, model, **hints):
        """
        Attempts to write auth and contenttypes models go to auth_db.
        """
        if model._meta.app_label in self.route_app_labels:
            return 'auth_db'
        return None

    def allow_relation(self, obj1, obj2, **hints):
        """
        Allow relations if a model in the auth or contenttypes apps is
        involved.
        """
        if (
            obj1._meta.app_label in self.route_app_labels or
            obj2._meta.app_label in self.route_app_labels
        ):
           return True
        return None

    def allow_syncdb(self, db, app_label, model_name=None, **hints):
        """
        Make sure the auth and contenttypes apps only appear in the
        'auth_db' database.
        """
        if app_label in self.route_app_labels:
            return db == 'auth_db'
        return None

DbRouter.py


class DatabaseAppsRouter:

    def db_for_read(self, model, **hints):
        """Point all read operations to the specific database."""
        if model._meta.app_label == 'wfo_employees':
            return 'work_from_office'
        if model._meta.app_label == 'wfh_employees':
            return 'work_from_home'

    def db_for_write(self, model, **hints):
        """Point all write operations to the specific database."""
        if model._meta.app_label == 'wfo_employees':
            return 'work_from_office'
        if model._meta.app_label == 'wfh_employees':
            return 'work_from_home'

    def allow_relation(self, obj1, obj2, **hints):
        """Have no opinion on whether the relation should be allowed."""
        return None

    def allow_syncdb(db, app_label, model_name=None, **hints):
        """Have no opinion on whether migration operation is allowed to run. """
        return None

Я использую django версию 3.0.4 и python версию 3.7

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