Синхронизация базы данных django для автономного использования - PullRequest
20 голосов
/ 29 июля 2011

У меня есть один главный сервер django, где хранятся данные (база данных mysql).

Онлайн: я бы хотел, чтобы многие пользователи синхронизировали копии из этой базы данных (должны копироваться только дельты) на своих ноутбуках (sqlLite DB)

Автономно (пользователи не имеют доступа к главному серверу): пользователи могут просматривать и обновлять свою локальную базу данных.

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

Я думаю, что поскольку у меня есть 2 вида базы данных, мне нужно синхронизироваться на уровне объекта django. Есть ли приложение django, которое делает это? Если нет, как вы будете кодировать такую ​​функцию?

Ответы [ 3 ]

3 голосов
/ 30 июля 2011

Оказывается, я использую такую ​​систему в Django.

Это не полный ответ, просто ответ, который в настоящее время решает (в основном) проблему.

  • Использование UUID для первичных ключей. Это значительно уменьшает коллизию первичных ключей для разных объектов.
  • Используйте структуру сериализации Django для обмена данными. Сайт центрального администратора имеет возможность загружать выбранные объекты из списка изменений в Django-совместимый сериализованный файл. Затем пользователь может перейти в автономный режим и запустить локальный сайт администратора, а затем загрузить сериализованный файл. После завершения автономной редакции используется тот же процесс: на «автономном» административном сайте объекты сериализуются в файл и загружаются на центральный административный сайт.
  • Платформы сериализации очень полезны, так как вы можете получить реальный (и несохраненный) объект, затем решить сохранить его или нет и изменить некоторые поля перед сохранением.

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

Я говорил с некоторыми людьми об этом и предложил мне несколько решений:

  • Используйте поле метки времени: это поможет решить, какую версию сохранить, а какую - удалить.
  • Используйте поля версии, с номерами мэров и младших версий. Незначительное редактирование (например, исправление орфографии) обновляет только младший номер версии, а основные изменения обновляют номер версии мэра и устанавливают минорный номер 0. Таким образом, при сравнении вы всегда знаете, какой из них имеет более высокий приоритет. Однако это требует обучения и соглашений в редактировании пользователей.
  • Обновления объектов. Отдельная модель, в которой хранятся обновления, поступающие из автономных изменений. Затем «главный» редактор объединяет их с реальным объектом, помогая с некоторыми дополнительными представлениями администратора для просмотра различий (используя google-diff-match-patch и т.п.). Объект также может быть помечен, чтобы разрешить прямые обновления, то есть не сохранять обновления и применять их непосредственно по прибытии. Неудобство заключается в том, что «главный» редактор должен просматривать все обновления, и это зависит от того, сколько информации обновляется.

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

1 голос
/ 07 апреля 2015

Я создал приложение Django, которое делает это. Когда экземпляры модели создаются в версии приложения для удаленного компьютера / ноутбука, они помечаются как грязные и получают временный идентификатор. Удаленное приложение регулярно проверяет подключение к главному серверу. Когда есть сетевое соединение, то есть приложение подключено к сети, оно получает постоянный идентификатор для каждого нового экземпляра грязной модели с главного сервера. Временные идентификаторы заменяются постоянными идентификаторами, а затем грязные экземпляры синхронизируются с ведущим.

Я использовал среду REST Django для получения и обновления экземпляров грязной модели на главном сервере.

Обратите внимание, что для этого также необходимо запустить локальный веб-сервер на автономном компьютере. Для этого я выбрал CherryPy.

0 голосов
/ 29 июля 2011

Ну, на самом деле я не знаю, есть ли для этого приложение django, но я продолжу так:

создать метод для «offline_update»: подключение к базе данных сервера, вы выбираете все объекты, чей идентификатор совпадает с идентификатором в локальной базе данных. Вы обновляете локальную базу данных. затем вы выбираете остальные записи и добавляете их в локальную базу данных

создать метод для "online_update" той же самой подпрограммы, инвертированный.

PRO: легко реализовать (Objects.all () получает все, затем вы манипулируете и обновляете, или сохраняете напрямую)

CONS: условия гонки (что, если 2 пользователя обновят одну и ту же запись (необязательно в одно и то же время)? У кого самая обновленная запись?)

вы в основном создаете что-то вроде "mysql-svn", чтобы обновлять две базы данных.

Я голосую +1 за ваш вопрос, потому что это действительно интересно. Я всегда работал, сбрасывая базу данных (через mysql), а затем загружая в локальную базу данных. без использования django.

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