Лучше описание - перефразирую проблему в новом разделе.
Вопрос : как организовать ./manage migrate
на клиенте в следующей настройке:
- Мне нужно создать веб-сайт django на клиентской машине, чтобы локальный пользователь мог войти туда и сделать что-то локально.
- Существует также сервер с огромным приложением django, у которого есть пользователи.что-то делать на сервере.
- И на клиентском компьютере есть приложение «просто python», которое получает данные, переданные с сервера, хранится локально и работает с локальной копией с помощью прямых запросов SQL (множество серверных таблиц-соединений).не используются), изменяя только две локальные таблицы, структура (но не данные) копируется с сервера для согласованности.
Серверное приложение django и клиентские приложения "just python" уже имеютустановленный протокол для подключения и передачи данных, чисто с сервера на клиент.Не все таблицы передаются (поскольку не все нужны), иногда на клиенте применяется только структура таблицы, иногда также данные.
Таблицы передаются так же, как содержимое "обычных таблиц Mysql" через некоторый XML / ssh / что угодно, теряя свои соединения django, в основном без аутентификации. * / Admin. * / Session. * / Content. * Tablesпередаются (как не относящиеся к делу), в то время как многие модели django имеют внешний ключ "updated_by_user" для (непереданной) таблицы пользователей.Это не имеет значения для клиента.
Нет, мне нужно создать локальную сеть django на клиенте, с
- собственным набором пользователей, некоторые профили (подключено OnToOneдля локальных пользователей)
- свои собственные локальные таблицы, которые доступны для чтения / записи для локального использования, но не конфликтуют с таблицами из общих таблиц сервера
- (скопированы с сервера, только для чтения)на клиенте, иногда перезаписывается протоколом совместного использования)
Я пишу часть django на стороне клиента с нуля, у меня есть доступ к источнику серверной части (поэтому я могу скопировать models.pyнапример), но мне нужно добавить
- локальные аутентификации
- управлять содержимым таблиц "только локальные"
- иметь возможность расширять их путем миграции, но делатьне изменять путем переноса существующих «из таблиц Mysql, скопированных с сервера»
- использовать некоторые данные, отображаемые только из таких «таблиц копирования с сервера» (некоторые будут связаны внешним ключом из этих локальных таблиц.
Трудно обещать, что эти скопированные таблицы не сделают ничего дикого (просто увеличатся в длине, и в существующих записях будут максимально изменены некоторые логические столбцы, возможно, позже будут добавлены дополнительные поля, но ни одно из них не будет удалено или изменено - либо по структуреили по смыслу))
Вопрос - как мне создать свое «клиентское приложение django», чтобы его можно было обслуживать, сосуществовать (и работать с) серверными копиями таблиц.
Я могу создать свое приложение с объявлением некоторых моделей, перенести, скопировать «модели серверов», перенести с помощью --fake
эту часть, а затем продолжить как обычно, но оно будет установлено на большем количестве клиентов, и структура общего доступаПозже таблицы могут добавить что-то, что мне нужно будет прочитать - так что еще одна --fake
миграция
Есть ли способ сделать некоторые миграции по умолчанию "--fake", чтобы он вообще не мигрировал вообще, но не будут предлагаться как невыполненные (если эти модели будут меняться)?Или я просто должен назвать все такие миграции "0007_PLEASE_FAKE_ME" и делать это вручную каждый раз на каждом клиенте? Или ему нужен совершенно другой доступ?
Нет данных, отправляемых от клиента к серверу, и может обслуживатьотправлять любые изменения данных / структуры, которые он хочет, в любое время. Это не должно создавать проблем для моего приложения в любом случае, и если будут отражены некоторые структурные изменения, я буду предупрежден раньше, и это может быть сделано через несколько дней / недель после того, как передача действительно произошла.
Я даже могу отправить свои запросы на изменение модели сотрудникам "сервера", чтобы включить их в их models.py и передать их как "обновление только для структуры"
Я могу включить их models.pyМне также, если это изменится.
Тем не менее я не уверен, как мой профиль OneToOne для пользователя будет работать на сервере, где много уже установленных пользователей и ни одна модель профиля ...
версия Djago одинакова на сервере и клиенте (1.10), все таблицы MyISAM.
Спасибо за все предложения
Изменения (для @Thushar):
Клиенты обычно работают 24/7/365, таблицы переносятся в логическом порядке по зависимостям: сначала те, которые заканчиваются, затем те, которые ссылаются на них, ядро ссылается на все остальные в последнюю очередь -таким образом, модель базы данных всегда согласована (просто может быть не завершена при передаче, все использованное уже имеет предварительные условия, уже переданные)
'Created_by' не используется (не обращается) на клиентах.Пока что клиенты запускают только некоторый код Python, который использует перечисление подмножества столбцов и таблиц.это работает около 5+ лет.
Модификации сначала идут на сервер (который заполняет значения в таблицы), затем таблицы передаются клиентам, затем клиенты получают обновление ПО, которое использует новоефункции (поэтому он работает каждый раз по-старому или по-новому с совершенно новыми данными) Сервер использует django, клиенты используют простой SQL select name,filename, volume from themes where active=1
изменения схемы базы данных сначала выполняются на сервере, затем передается клиенту, затем клиент sw обновляется для использования новых столбцов (например, SQL ... AND plaing_allowed=1
. Изменения обратно совместимы, поэтому даже клиент с 10 версиями устаревшего ПО может работать с полностью актуальными данными, просто пропуская некоторые новые функции.
API для переноса базы данных довольно стабилен (даже если он немного медленный), передает некоторую форму данных TXT / XML по SSH (много раз никакое другое соединение не доступно для клиента) - с таблицейСначала описания, затем каждая измененная строка в порядке - и порядок переводов структурирован так, что может быть прерван в любой момент безвлияет на способность клиента работать.ПО на клиенте обновляется после базы данных, поэтому есть (старый клиент, старые данные - работает) (старый клиент, новые данные - работает как предыдущая версия вместе) (новый клиент, новые данные - работает как новая версия)
старый клиент просто игнорирует (не знает) о новых таблицах / полях и пропускает некоторые новые функции (также отсутствует способ вызова таких функций), поэтому он работает, как будто никаких изменений вообще не было.
О новых записях (строках) - сначала передаются зависимости (поэтому нет возможности их использовать), затем больше основных таблиц (которые затем уверены, что все используемые ими отношения уже существуют) - зависимостиявляются древовидными, поэтому возможно (и сделано) упорядочить его таким образом, чтобы сначала были переданы листья, потом - узлы, потом корень - (поэтому, если передача прервана, возможно, что некоторые листья / поддеревья являются "заблудшими"/ недоступно, но все доступное имеет все зависимости), это уже работает 5+ лет и десятки или сотни версий.Клиент гораздо больше «устройство», чем «компьютер», даже если он работает с полной ОС на платформе ПК - планы составляются на сервере, клиенты просто выполняют заказы и при необходимости выполняют необходимые вычисления.
Снова старый способ (django с mysql на сервере, python с mysql на клиентах) работает надежно долгие годы.
Не каждый раз, когда соединение клиент-сервер возможно, тогда клиенты предполагают работать «локально» на старых данныхДо тех пор, пока соединение снова не станет доступным (иногда через часы, иногда через месяцы).
Но «это просто работает».
Моя задача - создать новое приложение django, которое должнобыть выпущенным на некоторых (возможно, на всех) клиентах, что добавляет некоторые «локальные функции» к существующей схеме, в основном
- имеет несколько новых таблиц для размещения некоторых планов и данных в
- имеет некоторый веб-интерфейс, чтобы пользователи могли регистрироваться через веб-браузер непосредственно на клиенте (который сам по себе является небольшим сервером с apache + django + mysql) и планировать там некоторые локальные события - эти события НЕ распространяются обратно на главный сервер и не изменяются "официальные таблицы ", просто читает, что доступно и делает" локальные заметки "
- эти" локальные заметки ", а затем использует уже существующий API на клиенте, чтобы замечать его в более отдельных задачах, которые необходимо сделать" прямо сейчаси здесь "- такой API существует уже и используется локально некоторым устаревшим приложением (запущенным на пользовательских ПК / NB), которое должно быть заменено веб-интерфейсом на это новое приложение django на клиенте.
- цель -чтобы иметь возможность расширять веб-интерфейс для использования некоторых специальных «локальных таблиц», а также читать их «официально распределенные» и расширять локальный API, чтобы предоставлять больше возможностей, локальный API для этого (на клиенте) просто считывает данные из таблиц и актовна них, ничего не изменяя в базе данных.(Новая версия локального API должна читать и для локальных таблиц для большей функциональности)
Моя проблема в том, как разработать клиентское приложение django с учетом некоторых обновлений схемы базы данных "изредка случается на фоне ".
Новая версия нового приложения django может действительно утверждать, что все новые «фоновые изменения в глобальных таблицах» уже действуют, когда оно выпущено и требуются только изменения локальных таблиц.
Уже существующая система (оптимизированная для различных критериев) намного больше, чем новая часть, поэтому переписать ее с нуля не вариант.Также есть некоторые «не обновляемые части», такие, что старый способ связи должен быть поддержан в любом случае в новой версии, так как от него зависит какой-то компьютер, полностью недоступный для меня.(Но протокол связи спроектирован так, чтобы его можно было расширить, поэтому нет большой проблемы, добавьте туда еще немного информации)
Лучшее описание
- Главный компьютер M и идентичныйподчиненные компьютеры S (1..x)
- Мастер M запускает Myslql + Django + Apache и имеет 1 API (MS)
- Мастер имеет таблицы TA (1 ..), TB (1..), TC (1 ..)
- Схема таблицы передачи MS API (аналогично CREATE TABLE) для всех таблиц TA и TB (либо полных, либо измененных)
- MS затем передает изменения данных для таблиц TA
- Таблицы TC вообще не переносятся
- Slave S теперь работает Mysql +Старая программа и имеет 2 APIS
- MS API (для мастера по сети)
- S-local (XML основан на старой локальной связи OldApp )
- Мастер (не регулярно, но достаточно часто, например, 1-10 раз в день) связывается с каждым ведомым устройством и через MS вызывает обновления базы данных на нем
- Slave не обновляет таблицы на Master (ну, есть некоторые отчеты о состоянии и тому подобное, но это не обязательно и не интересно)
- Slave выполняет свою работу (в основном, проигрывая музыку, основываясь на некоторых подсказках изТаблицы TA) независимо (планирование перестановок и так далее самостоятельно)
- когда замечено XML из OldApp через S-local API, Slave останавливает то, что делает и воспроизводит соответствующее сообщение, затем продолжает
- S-local API управляется каким-то устаревшим приложением с закрытым исходным кодом OldApp , которое должно быть заменено на NewApp (см. Далее)
- OldApp работает на компьютерах пользователей (полностью отличается от главного и подчиненного) под Windows и имеет жестко закодированные строки XML для отправки на ведомый S
- много информации изMaster M не имеет значения для Slave S (в основном для всех авторизаций и пользователей, поскольку решения по Slave основаны на различных критериях, а таблицы TA де-факто доступны только для чтения.e)
- все это работает много лет, и из-за большого количества изменений в версии слишком велико, чтобы переписать в нормальное время.
Новый подход заключается в создании и запуске на базе Slave S NewApp приложения django (+ Apache), чтобы предложить лучшую и новую функциональность, чем OldApp для веб-страниц (размещенных на Slave S).)
Для этого требуется:
- авторизация (отличается от Master, но все таблицы Master auth. * Находятся в группе TC и вообще не переносятся, поэтому могут быть локальноиспользуется повторно на ведомом устройстве
- отличается для каждого ведомого устройства, не сообщается мастеру
- читает некоторые таблицы группы ТА (но только читает, выполняетне изменять содержимое)
- свой собственный набор таблиц TD (1..x) для сохранения - конфигурации, звуки и отношения - локальные для конкретного подчиненного устройства
- , отличающиеся длякаждый ведомый, не сообщаемый мастеру
- использует S-local API (и расширяет его немного - не проблема)
Опрошенрешение:
- Скопируйте модели таблиц TD на Master и дайте их перенестиd с таблицами TB в подчиненные устройства (только структура)
- аналогично переносят таблицы авторизации * в Master (в случае группы TB, только структуры, но не данные) в подчиненные устройства
- установка новой версии в NewApp следующим образом:
- обновить TD на Master для синхронизации с новой версией TD в NewApp и выполнить миграцию на Master
- сделать перевод на подчиненных (так что новая версия там принудительно)
- обновить NewApp на подчиненных и использовать только
./manage.py migrate --fake
, чтобы остановить жалобы
Нет проблем с MS API и его переносами (он просто работает, а значения по умолчанию в базе данных применяются к новым полям существующих записей / строк), созданием представлений и шаблонов (AFAIK, если таблица длямодель содержит больше полей, чем модель, такие поля просто игнорируются)
Таким образом, Master не будет использовать таблицы / модели TD никоим образом (без интерфейса, без администратора, просто будучи там пустым), а ведомый будет обновляться извнесинхронно с Учителем.В обоих случаях Models.py будет одинаковым в части данных (возможно, в некоторых таблицах TA / TB отсутствует основная функция TD и методы отсутствия подчиненных)
Вопросы
- может ли это работать таким образом (фальшивые миграции)
- существуют ли какие-то "системные" таблицы, необходимые (и автоматически управляемые) django на Master, которые необходимо перенести (в конце концов, с данными) в подчиненные устройства (вероятно,что-то о том, что выполняется миграция, или о структуре таблиц, необходимых для удовлетворения требованиям models.py) 2.1.такие таблицы переносятся, нужны ли даже поддельные миграции на Slave?(ИМХО их бы не было, так как в этих таблицах упоминаются все миграции и подходят модели)