Маршрутизация Django Db

Я пытаюсь запустить приложение Django с двумя db (1 master, 1 read replica). Моя проблема в том, что если я попытаюсь прочитать сразу после записи, то код взрывается. Например:

  • p = Product.objects.create ()
    1. Product.objects.get (ID = p.id)

ИЛИ

    1. Если пользователь перенаправляется на страницу сведений о продукте

Код работает быстрее, чем прочитанная реплика. И если операция чтения использует реплику, код выходит из строя, потому что он не обновлялся вовремя.

Есть ли способ избежать этого? Например, db для чтения выбирается по запросу вместо операции?

Мой маршрутизатор идентичен документации Django:

import random class PrimaryReplicaRouter(object): def db_for_read(self, model, **hints): """ Reads go to a randomly-chosen replica. """ return random.choice(['replica1', 'replica2']) def db_for_write(self, model, **hints): """ Writes always go to primary. """ return 'primary' def allow_relation(self, obj1, obj2, **hints): """ Relations between objects are allowed if both objects are in the primary/replica pool. """ db_list = ('primary', 'replica1', 'replica2') 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 

3 Solutions collect form web for “Маршрутизация Django Db”

В зависимости от размера данных и приложения я бы справился с этим одним из следующих способов:

  1. Фиксирование базы данных:

Расширьте свой маршрутизатор базы данных, чтобы разрешить функции привязки к конкретным базам данных. Например:

 from customrouter.pinning import use_master @use_master def save_and_fetch_foo(): ... 

Хороший пример этого можно увидеть в django-multidb-router . Конечно, вы можете просто использовать этот пакет.

  1. Используйте диспетчер модели для маршрутизации запросов к конкретным базам данных .

     class MyManager(models.Manager): def get_queryset(self): qs = CustomQuerySet(self.model) if self._db is not None: qs = qs.using(self._db) return qs 
  2. Напишите промежуточное программное обеспечение, которое будет автоматически направлять ваши запросы на master / slave. В принципе, такой же, как метод пиннинга, но вы не укажете, когда нужно запускать запросы GET против master.

Решил его:

 class Model(models.Model): objects = models.Manager() -> objects only access master sobjects = ReplicasManager() -> sobjects access either master and replicas class Meta: abstract = True -> so django doesn't create a table 

чтобы каждая модель расширила этот вариант вместо моделей. Моделяйте, а затем используйте объекты или объекты, хочу ли я получить доступ только к мастеру или если вы хотите получить доступ к мастеру или репликам

IN master replica conf для новых данных потребуется несколько миллисекунд для репликации данных на всех других серверах / базе данных реплик.

поэтому всякий раз, когда вы пытались читать после записи, это не дает вам правильного результата.

Вместо чтения из реплики вы можете использовать мастер для чтения сразу после записи, используя ключевое слово using('primary') с вашим запросом на получение.

  • Сценарий haystack elasticsearch RealtimeSignalProcessor обновляет только соединение по умолчанию
  • Приложения не будут отображаться в администраторе Django
  • Проблемы со статическими файлами Django 1.4 и не отображаются в других URL-адресах моего проекта
  • Django: таблица не существует
  • Проверка Django и промежуточное ПО
  • Используя салат, как я могу проверить, что письмо, отправленное из веб-приложения Django, имеет правильное содержание?
  • Почему скрипт Python работает из CLI, но не при вызове из задания cron?
  • Запрос фильтра Django - не работает
  •  
    Interesting Posts for Van-Lav

    подсчет вхождения массивов в многомерных массивах в python

    Как получить весь текст между двумя указанными тегами с помощью BeautifulSoup?

    Модели Django – SELECT DISTINCT (foo) Из таблицы слишком медленно

    Как получить кодировку терминала из сценария python?

    обработка текста из не-плоского файла (для извлечения информации, как если бы она была * плоским файлом)

    Почему Python не позволяет ссылаться на класс внутри его определения?

    Emacs 24.3 python: не могу догадаться о смещении python-indent-offset, используя значения по умолчанию 4

    PyCharm не обнаруживает переводчика

    Построение нескольких разных графиков на одной фигуре с помощью Seaborn

    Изменить часовой пояс для объекта Date Python

    django apache mod-wsgi зависает при импорте модуля python из файла .so

    Можно ли распаковать кортеж без использования переменных?

    Python threading.Event () – обеспечение ожидания всех ожидающих потоков на event.set ()

    Смещение DatetimeIndex с

    Ошибка установки программы

    Python - лучший язык программирования в мире.