Vladimir
Да, именно
Ohar
Ну и что тут сложного?
Ohar
Это просто писать долго
Vladimir
Слишком много писать да
Vladimir
Поэтому вместо это сохраняют версию схемы
Ohar
Но и то по первому разу
Ohar
Версию схемы?
Vladimir
Да, в базе записана текущая версия схемы
Vladimir
Берется версия из базы и версия из кода
Vladimir
И выполняются все миграции между ними
Ohar
Ок, ты проверил, она не та, которая нужна, твои действия?
Ohar
Ну то есть у тебя всё равно написан миллион скриптов миграций
Vladimir
Да, но по крайней мере там код который реально нужно выполнять
Ohar
не понял твою мысль
Ohar
а бывает другой код?
Vladimir
Если проверять по одному полю, то будет много лишней работы
Ohar
для меня или машины?
Vladimir
Например, когда ты в реальности добавил 10 полей за раз
Vladimir
Ohar
Для меня работы не меньше, чем скрипт миграции написать
Ohar
а машинное время оно для того и создано чтобы работу выполнять
Vladimir
Тем более, поля могут зависетб друг от друга
Vladimir
И проверять их нужно в определенном порядке
Ohar
типа foreign key?
Vladimir
Нет
Ohar
а как?
Vladimir
Допусти мы хотим добавить поле A, в него прописать какое то значение по дефолту
Ohar
так
Vladimir
Затем мы хотим добавить поле B, и прописать в него по дефолту то же, что и в A
Ohar
так
Vladimir
Соответственно, поля нужно всегда проверять именно в таком порядке
Vladimir
И порядок этот поддерживать руками
Ohar
Ну а в скриптах миграции как-то решена эта проблема?
Vladimir
В том что каждая миграция пишется отдельно и потому не трогается, и все они пишутся в конретном порядке
Ohar
Ну ты проверки тоже пишешь в каком-то порядке
Ohar
И тоже отдельно — по версиям приложения
Ohar
Разве нет?
Vladimir
Просто создается много дополнительных состояний, которые нужно проверять
Vladimir
Например, проверяешь, что есть поле B, но нет поля A
Vladimir
Хотя в реальности если есть B, то A уже должно быть
Vladimir
Но в принципе можно сделать примерно похожее поведение
Vladimir
Если считать что новое поле=миграция
Dmitry
грубо говоря эти скрипты выполняются по порядку
Dmitry
накатывая все изменения на базу исторически
Dmitry
и тогда ты получаешь последнюю версию
Dmitry
без потери данных
Dmitry
и тогда можно обновляться с любой версии на любую нажал я npm update myapp
Dmitry
и получил в preinstall апдейтики
Dmitry
я пока так планирую
Ale
Вам скорее всего не нужен, но есть такая штука как event sourcing (типа как redux на клиенте). Там достаточно просто удалить все данные, кроме ивентов и рестартануть ивенты
Ale
А так запилите коллекцию с миграциями, куда пишите последнюю версию схемы. Скрипт запуска миграций такой: взять последнюю версию из базы, взять из папки все более новые миграции и накатывать по одной
Ale
В миграцию есть смысл добавлять две команды - up и down. Если потом придётся откатывать
Anonymous
выносятся в отдельные микросервисы, с возможностью блокировки операции записи
Ale
Evgeny
Я, кажется, понял. Чувак, а ты знаешь как работают замыкания?
Ohar
да, электрические
Vitaliy
Andrew
Можешь ещё раз вопрос сформулировать?
вопрос в следующем - в пыхе когда приходит коннект от браузера, хедеры всякие, сам реквест, будь то гет или пост или что еще, скрипт отрабатывает, отдает результат и завершается, с полной очисткой памяти. поэтому искаропке в пыхе нет и не бывает никакого стейта, каждый раз приходится с клиента куку слать, парсить ее, сессию из файла или еще откуда таскать и прочие ужосы. в ноде все иначе, плюс коннект может не обрываться, в частности для СПАхи с кучей аякса это вообще гут. Плюс пока процесс крутится, он хранит весь стейт. Т.е. вот ты запустил node index.js допустим и доколе скрипт не завершит выполнение всех-всех-всех операций либо не крашнется, стейт сохраняется, а если мы в скрипте запустим веб-сервер, который слушает порт, то все, пока скрипт не крашнется или по CTRL-C Или как еще не отвалится, стейт хранится. При этом на порт лосятся клиенты с разных браузеров, т.е. один и тот же скрипт обслуживает кучу разных запросов. Я нутром чую, что для каждого отдельного коннекта стейт хранится отдельно, иначе это была бы вакханалия. Вопросов два - евент луп единый для всех коннектов или тоже по лупу на каждый коннект? И насколько сильно изолированы стейты, могут ли они сообщаться с ведома скрипта?
Дима
Я, кажется, понял. Чувак, а ты знаешь как работают замыкания?
Владимир
есть общий стейт - это все переменные в скрипте
Владимир
а есть стейт реквеста - он в обработчике
Andrew
т.е. я правильно понимаю что на потоке единый стейт на все коннекты?
Andrew
Владимир
например, если ты делаешь скрипт
var players = [];
app.post(‘/addPlayer’, (req,res)=>{
players.push[req.body.name]
})
то в players будет общий стейт
Владимир
и поток один
Andrew
т.е. любой коннект в потенциале может получить доступ к этому общему стейту?
Kons
Что такое стейт? Есть переменные и есть их область видимости. Обработчик запроса — функция. Всё, что было в функции, остаётся в функции.
Владимир
Andrew
стейт это все переменные запущенного скрипта
Andrew
вообще все
Ohar
Он на то и общий какбэ
Andrew
понял, мерси
Andrew
хотя одну штуку не догоняю я еще
Andrew
вот 100 бразуеров ломятся на порт
Andrew
т.е. 100 коннектов имеем
Andrew
и для каждого надо сходить в бд
Andrew
т.к. все асинхронно и евент луп
Andrew
непойми когда что отработает