DJango переключение между базами данных - PullRequest
0 голосов
/ 09 мая 2020

Я новичок ie в python и DJango, так что, пожалуйста, объясните поподробнее. Я хочу использовать в DJango 3 базах данных: 1) для DJango auth, admin и т. Д. 2) для локального магазина веб-сайтов 3) для основной базы данных

Итак, во-первых, в моем старом проекте ( PHP) Я использовал две базы данных:

* База данных Frist (localdatabase): -> Эта база данных работала на моем веб-хосте и содержит некоторые переменные для основной базы данных

* Вторая база данных ( основная база данных): -> Содержит много таблиц и строк, внутри которых не работает локальная база данных.

Итак, я хочу создать сценарий, который читает таблицы в следующем порядке: Auth> Localdatabase> Maindatabase

Пример: * В локальной базе данных есть следующие таблицы: -> автобренды -> автозапчасти

  • В основной базе данных есть эти таблицы: -> AllAutoBrands -> AllAutoParts.

Я был пытаюсь подключить несколько баз данных, но не понимаю, почему читаю только 2 из них. Код читает базу данных аутентификации и локальную базу данных.

У меня есть этот код:

settings.py

DATABASES = {
    'default': {},
    'auth_db':
    {
        'NAME': 'gws2',
        'ENGINE': 'django.db.backends.mysql',
        'USER': 'root',
        'PASSWORD': '',
    },
    'primary': {
        'NAME': 'gws',
        'ENGINE': 'django.db.backends.mysql',
        'USER': 'root',
        'PASSWORD': '',
    },
    'secondary':{
        'NAME': 'gwsautqe_ocar890',
        'ENGINE': 'django.db.backends.mysql',
        'USER': 'root',
        'PASSWORD': 'UkVP0qdlle9TKP2z',
        'HOST': '46.231.42.12',
        'PORT': '3306',
    }
}

DATABASE_ROUTERS = ['gwsauto.routes.AuthRouter', 'gwsauto.routes.PrimaryReplicaRouter', 'gwsauto.routes.SecondaryReplicaRouter']

routes.py

class AuthRouter:
    route_app_labels = {'auth', 'contenttypes'}

    def db_for_read(self, model, **hints):
        if model._meta.app_label in self.route_app_labels:
            return 'auth_db'
        return None

    def db_for_write(self, model, **hints):
        if model._meta.app_label in self.route_app_labels:
            return 'auth_db'
        return None

    def allow_relation(self, obj1, obj2, **hints):
        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_migrate(self, db, app_label, model_name=None, **hints):
        if app_label in self.route_app_labels:
            return db == 'auth_db'
        return None

class PrimaryReplicaRouter:

    def db_for_read(self, model, **hints):
        return 'primary'

    def db_for_write(self, model, **hints):
        return 'primary'

    def allow_relation(self, obj1, obj2, **hints):
        db_list = ('primary')
        if obj1._state.db in db_list and obj2._state.db in db_list:
            return True
        return None

    def allow_migrate(self, db, app_label, model_name=None, **hints):
        return True

class SecondaryReplicaRouter:

    def db_for_read(self, model, **hints):
        return 'secondary'

    def db_for_write(self, model, **hints):
        return 'secondary'

    def allow_relation(self, obj1, obj2, **hints):
        db_list = ('secondary')
        if obj1._state.db in db_list and obj2._state.db in db_list:
            return True
        return None

    def allow_migrate(self, db, app_label, model_name=None, **hints):
        return True

models.py

из django .db import models

class CarModels(models.Model):   
    description = models.CharField(max_length=100)
    class Meta:
        db_table = "models"

class CarAuto(models.Model):
    BrandName =   models.CharField(max_length=100)
    class Meta:
        db_table = "gws_brands"

В текущем коде: GWS_brands находится в локальной базе данных, а «models» - в основной базе данных. Ошибка: Ошибка

Извините за мой английский sh. Заранее спасибо

1 Ответ

0 голосов
/ 09 мая 2020

Поместите свои CarModels внутрь app1/models.py и CarAuto внутрь app2/models.py

роутеры

class AuthRouter:
    route_app_labels = {'auth', 'contenttypes'}

    def db_for_read(self, model, **hints):
        if model._meta.app_label in self.route_app_labels:
            return 'auth_db'
        return None

        def db_for_write(self, model, **hints):
            if model._meta.app_label in self.route_app_labels:
                return 'auth_db'
            return None

    def allow_relation(self, obj1, obj2, **hints):
        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_migrate(self, db, app_label, model_name=None, **hints):
        if app_label in self.route_app_labels:
            return db == 'auth_db'
        return None

class PrimaryReplicaRouter:

    route_app_labels = {'app1'}

    def db_for_read(self, model, **hints):
        if model._meta.app_label in self.route_app_labels:
            return 'primary'
        return None

    def db_for_write(self, model, **hints):
        if model._meta.app_label in self.route_app_labels:
            return 'primary'
        return None

    def allow_relation(self, obj1, obj2, **hints):
        db_list = ('primary', 'secondary')
        if obj1._state.db in db_list and obj2._state.db in db_list:
            return True
        return None

    def allow_migrate(self, db, app_label, model_name=None, **hints):
        if app_label in self.route_app_labels:
            return db == 'primary'
        return None

class SecondaryReplicaRouter:

    route_app_labels = {'app2'}

    def db_for_read(self, model, **hints):
        return 'secondary'

    def db_for_write(self, model, **hints):
        return 'secondary'

    def allow_relation(self, obj1, obj2, **hints):
        db_list = ('secondary')
        if obj1._state.db in db_list and obj2._state.db in db_list:
            return True
        return None

    def allow_migrate(self, db, app_label, model_name=None, **hints):
        return True

теперь запустите python manage.py makemigrations затем python manage.py migrate --database= (foreach database )

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