Django 3 multi-base не работает при переносе - PullRequest
0 голосов
/ 18 марта 2020

Я использую Django 3 с 3 приложениями: безопасность, историк, стенд. Каждое приложение имеет свою собственную базу данных. в settings.py :

DATABASE_ROUTERS = [
    'security.router.securityRouter',
    'bench.router.benchRouter',
    'historian.router.historianRouter', 
    ]

DATABASES = {
    'default': {
        'ENGINE': 'sql_server.pyodbc',
        'NAME': 'DB_DJANGO',
        'HOST': 'LOCALHOST\\SQLEXPRESS',
        'PORT': '1433',
        'USER': 'user',
        'PASSWORD': '******',
        'OPTIONS':{
            'driver': 'ODBC Driver 17 for SQL Server',
        }
    },
    'BdBench': {
        'ENGINE': 'sql_server.pyodbc',
        'NAME': 'BD_Bench',
        'HOST': 'LOCALHOST\\SQLEXPRESS',
        'PORT': '1433',
        'USER': 'sa',
        'PASSWORD': '5eCUr1tE',
        'OPTIONS':{
            'driver': 'ODBC Driver 17 for SQL Server',
        }
    },
    'BdBenchMeas': {
        'ENGINE': 'sql_server.pyodbc',
        'NAME': 'BD_Bench',
        'HOST': 'LOCALHOST\\SQLEXPRESS',
        'PORT': '1433',
        'USER': 'user',
        'PASSWORD': '******',
        'OPTIONS':{
            'driver': 'ODBC Driver 17 for SQL Server',
        }
    },
    'BdSecurity': {
        'ENGINE': 'sql_server.pyodbc',
        'NAME': 'BD_Security',
        'HOST': 'LOCALHOST\\SQLEXPRESS',
        'PORT': '1433',
        'USER': 'user',
        'PASSWORD': '******',
        'OPTIONS':{
            'driver': 'ODBC Driver 17 for SQL Server',
        }
    },
    'BdHistorian': {
        'ENGINE': 'sql_server.pyodbc',
        'NAME': 'BD_Historian',
        'HOST': 'LOCALHOST\\SQLEXPRESS',
        'PORT': '1433',
        'USER': 'user',
        'PASSWORD': '******',
        'OPTIONS':{
            'driver': 'ODBC Driver 17 for SQL Server',
        }
    },
}

, который я использую для каждого приложения: файл router.py: security / router.py :

class securityRouter(object):
    APPS = ['security', 'auth', 'sessions', 'contenttypes']
    BD = 'BdSecurity'

    def db_for_read(self, model, **hints):
        if model._meta.app_label in self.APPS:
            return self.BD
        return None

    def db_for_write(self, model, **hints):
        if model._meta.app_label in self.APPS:
            return self.BD
        return None

    def allow_relation(self, obj1, obj2, **hints):
        if obj1._meta.app_label in self.APPS and obj2._meta.app_label in self.APPS:
            return True 
        return None     

    def allow_migrate(self, db, app_label, model_name=None, **hints):
        if app_label in self.APPS:
            return db == self.BD
        return None

до историк / router.py :

class historianRouter(object):
    APPS = ['historian']
    BD = 'BdHistorian'

    def db_for_read(self, model, **hints):
        if model._meta.app_label in self.APPS:
            return self.BD
        return None

    def db_for_write(self, model, **hints):
        if model._meta.app_label in self.APPS:
            return self.BD
        return None

    def allow_relation(self, obj1, obj2, **hints):
        if obj1._meta.app_label in self.APPS and obj2._meta.app_label in self.APPS:
            return True 
        return None     

    def allow_migrate(self, db, app_label, model_name=None, **hints):
        if app_label in self.APPS:
            return db == self.BD
        return None

до скамейка / router.py :

class benchRouter(object):
    def db_for_read(self, model, **hints):
        if model._meta.app_label == 'bench':
            if model._meta.model_name == 'measurement':
                return 'BdBenchMeas'
            else:
                return 'BdBench'
        else:
            return None

    def db_for_write(self, model, **hints):
        if model._meta.app_label == 'bench':
            if model._meta.model_name == 'measurement':
                return 'BdBenchMeas'
            else:
                return 'BdBench'
        else:
            return None

    def allow_relation(self, obj1, obj2, **hints):
        if obj1._meta.app_label == 'bench' and obj2._meta.app_label == 'bench':
            return True  
        return None       

    def allow_migrate(self, db, app_label, model_name=None, **hints):
        if app_label == 'bench':
            return db == 'BdBench'
        return None

Когда я выполняю миграцию для каждого из приложений: python manage.py migrate security python manage.py migrate historian python manage.py migrate bench

Я получаю: в базе данных BD_Security нет таблиц в базе данных BD_historian нет таблиц в базе данных BD_Bench имеются таблицы стендов и исторические таблицы. в базе данных DB_ DJANGO имеется только одна таблица django_migrations

Я использую это Tuto django -multidb почему я не корректно переношу свои приложения / модели?

Кто-нибудь, чтобы помочь мне ?! Спасибо

1 Ответ

0 голосов
/ 18 марта 2020

Если вы выполняете миграцию с использованием разных баз данных, всегда следует добавлять переключатель --database, если это не база данных по умолчанию. Так сказано в документах , первом абзаце.

Вот так:

python manage.py migrate security --database BdSecurity
...