Какой лучший способ реализовать DB Router в Django? - PullRequest
0 голосов
/ 29 октября 2018

Я реализовал Автоматическую маршрутизацию БД в Django и использую AWS Aurora for Database с репликацией. Я обнаружил небольшую задержку репликации с моей базой данных, которая препятствует потоку. Возникает проблема, скажем, когда набор запросов на чтение выполняется с «ведомым», а затем при обновлении значения с использованием этого набора запросов выдается сообщение об ошибке «Доступ только для чтения к этой таблице». это означает, что для обновления он должен быть направлен на основную базу данных.

Вот мои настройки БД для нескольких БД:

DATABASES = {
    'master': {
        'ENGINE': 'django.db.backends.mysql',
        'STORAGE_ENGINE': 'MyISAM / INNODB / ETC',
        'NAME': 'db',
        'USER': 'master',
        'PASSWORD': 'master',
        'HOST': 'localhost',
        'PORT': '3306',

    },
    'slave': {
        'ENGINE': 'django.db.backends.mysql',
        'STORAGE_ENGINE': 'MyISAM / INNODB / ETC',
        'NAME': 'db',
        'USER': 'name',
        'PASSWORD': 'pass',
        'HOST': 'localhost',
        'PORT': '3306',

    },

    'slave2': {
        'ENGINE': 'django.db.backends.mysql',
        'STORAGE_ENGINE': 'MyISAM / INNODB / ETC',
        'NAME': 'db',
        'USER': 'name',
        'PASSWORD': 'pass',
        'HOST': 'localhost',
        'PORT': '3306',

    }

}


DATABASE_ROUTERS = ['path.to.AuthRouter']

Пожалуйста, предоставьте мне лучший способ автоматически обрабатывать маршрут с несколькими дБ в django.

"""
DB Router core class which auto selects required database configuration
"""
class AuthRouter:

    def db_for_read(self, model, **hints):
        """
        Reads go to a replica.
        """
        print 'db_for_read'
        print model
        return 'slave'

    def db_for_write(self, model, **hints):
        """
        Writes always go to master ie default.
        """
        print 'db_for_write'
        print model
        return 'master'

    def allow_relation(self, obj1, obj2, **hints):
        """
        Relations between objects are allowed if both objects are
        in the default/replica pool.
        """
        db_list = ('master', 'slave')
        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):
        """
        All non-auth models end up in this pool.
        """
        return True
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...