Size: a a a

2020 June 30

AM

Artem Malyshev in rannts
Alexander Zelenyak
Я тут скорее считаю проблемой само удаление объектов из базы...
А как? Фильтровать по полю is deleted?
источник

AZ

Alexander Zelenyak in rannts
Потому, эту проблему с save вообще никак не обрабатываю. Кроме того, что там будет сохранён весь объект целиком, а не только изменившиеся поля. Раньше у меня такой функционал был, но потом я вырезал за ненужностбю.
источник

AM

Artem Malyshev in rannts
Kirill (Cykooz) Kuzminykh
Как по мне это совсем не очевидное поведенеие
Для чего-то с именем save не может быть очевидного поведения.
источник

AZ

Alexander Zelenyak in rannts
Artem Malyshev
А как? Фильтровать по полю is deleted?
Мы используем removed, да. Нас не раз такой подход спасал от проблем.  Удаление это всегда опасная операция и я стараюсь без неё обходится. Пока успешно.
источник

AZ

Alexander Zelenyak in rannts
Artem Malyshev
Для чего-то с именем save не может быть очевидного поведения.
Ну почему же? Дефолтное поведение монги вполне очевидно: замена или создание объекта. Это ME выделывается, пытаясь минимизировать изменяемые поля, что делает поведение не очевидным.
источник

AM

Artem Malyshev in rannts
Alexander Zelenyak
Мы используем removed, да. Нас не раз такой подход спасал от проблем.  Удаление это всегда опасная операция и я стараюсь без неё обходится. Пока успешно.
И поскольку все вложенное в один документ нет проблемы каскадного удаления, чтобы removed флаг ставить в нескольких коллекциях?
источник

AZ

Alexander Zelenyak in rannts
Kirill (Cykooz) Kuzminykh
У нас 4-5 стендов на которых развёрнуто приложение, и они обновляются не всегда одновременно. Иногда может много времени пройти между тем как выпустим новый релиз и тем как мы обновим один из стендов.
Очень не хочется помнить все детали того, что надо сделать на стенде ручками прежде чем выкатитить обновление. Хочется просто нажать в Jenkins кнопку и что бы оно выкатилось без ручной работы.
Миграции.   🙂
источник

KK

Kirill (Cykooz) Kuzm... in rannts
Artem Malyshev
Для чего-то с именем save не может быть очевидного поведения.
Ну вот именно в Mongoengine оно по документации должно делать обновление если документ уже существует, и вставлять его - если не существует.
Но видимо сначала они сделали классическую оптимизацию по обновлению только изменившихся полей (думаю так делают все ORM). А потом почему-то решили делать upsert если юзер сам не добавил доп. условия для обновления. Мне совсем не понятно зачем они такое сделали и при этом сделали криво, забыв про то что  в запросе нет всех нужных полей, а только те, что изменились.
источник

AZ

Alexander Zelenyak in rannts
Artem Malyshev
И поскольку все вложенное в один документ нет проблемы каскадного удаления, чтобы removed флаг ставить в нескольких коллекциях?
Нет проблем ставить removed где угодно и сколько угодно. Говорю как серийный монговод.
источник

KK

Kirill (Cykooz) Kuzm... in rannts
Alexander Zelenyak
Ну почему же? Дефолтное поведение монги вполне очевидно: замена или создание объекта. Это ME выделывается, пытаясь минимизировать изменяемые поля, что делает поведение не очевидным.
Это не поведение монги. По дефолту монга делает именно update. upsert надо включать отдельной опцией
источник

AZ

Alexander Zelenyak in rannts
Kirill (Cykooz) Kuzminykh
Это не поведение монги. По дефолту монга делает именно update. upsert надо включать отдельной опцией
Кажется, что нет. Если мы говорим про метод save...
источник

AZ

Alexander Zelenyak in rannts
Есть апдейт, у которого есть опциональный апсерт, а есть сейв, который внутри тоже апдейт, но с апсертом.
источник

KK

Kirill (Cykooz) Kuzm... in rannts
Alexander Zelenyak
Миграции.   🙂
Жалко что нет нормальной реализации для монги. Надо самому их писать. А если у тебя приложение это библиотека-ядро, которое используется в отдельных приложениях-кастомизациях, то надо писать это хорошо, по взрослому. Что бы можно было добавлять миграции "снаружи".
источник

AZ

Alexander Zelenyak in rannts
Kirill (Cykooz) Kuzminykh
Жалко что нет нормальной реализации для монги. Надо самому их писать. А если у тебя приложение это библиотека-ядро, которое используется в отдельных приложениях-кастомизациях, то надо писать это хорошо, по взрослому. Что бы можно было добавлять миграции "снаружи".
Да и не нужна какая-то особая реализация для монги. В общем случае это просто скриптик, который должен запуститься до запуска новой версии приложения.
источник

AZ

Alexander Zelenyak in rannts
Запуститься из CI, конечно же.
источник

AZ

Alexander Zelenyak in rannts
У меня для этого есть свой костылик, но его стыдно показывать: https://github.com/zzzsochi/migranite
Написал за вечер в баре...
источник

AZ

Alexander Zelenyak in rannts
Пять лет назад... Офигеть время летит. Это я уже пять лет хочу поправить там схему подключения монги...
источник

KK

Kirill (Cykooz) Kuzm... in rannts
Alexander Zelenyak
Да и не нужна какая-то особая реализация для монги. В общем случае это просто скриптик, который должен запуститься до запуска новой версии приложения.
Это слишком простой взгляд на вещи. Вот у нас есть ядро, в котором есть свои миграции. У ядра есть разные версии - значит надо хранить все миграции, что бы можно было выполнить обновление перескочив через несколько релизов.
Ядро используется в кастомизациях, где тоже могут быть миграции и их тоже надо как-то хранить и запускать согласованно с миграциями в ядре.
Для ядра мы сделали аля супер-простой South для джанги - все миграции это скрипты в одной папке и есть коллекция, в которой храним список уже отработаных миграций. Но не хватает возможности добавлять миграции "снаружи", из кастомизаций, которые используют ядро как зависимость.
источник

AZ

Alexander Zelenyak in rannts
> все миграции это скрипты в одной папке и есть коллекция, в которой храним список уже отработаных миграций
Вот как раз мигранит это и делает.
источник

AZ

Alexander Zelenyak in rannts
И, в общем случае, это всё, что от такой системы требуется. Нам хватает за глаза.
источник