Наконец-то я нашел нормальное объяснение, что такое эти ваши миграции и кто куда мигрирует. Порой складывается ощущение, что люди пользуются чем-то, но сами не понимают для чего. И потом не могут ответить на вопрос зачем эта технология вообще нужна, если и без неë можно работать. А еще раздражают не интуитивно понятные термины, которые как-будто специально придумывают, чтобы преувеличить сложность и серьезность темы. Мне как новичку очень помогло(и вставки в идеальных местах. Когда хотел уже идти гуглить, но всплывашка быстро напомнила о чëм речь) 👏
Спасибо большое, очень понятно для начинающих. От себя добавлю - можно использовать lombok ну и вместо постоянного захода в браузер - можно не отходя от идеи просматривать все интересующие данные
да, даже если Community есть плагины для бд и запросов: plugins.jetbrains.com/plugin/1800-database-navigator plugins.jetbrains.com/plugin/14723-restfulbox
Шикарная статья, язык, пояснения, исправления, ссылки, сайт. Тайминг, анимация (одна только огненная стрелка чего стоит), схемы БД. Сразу узнал много нового и не вошёл в ступор от избытка информации
Задана новая планка плотности информации. Не видел раньше подбоного - параллельно с потоками видео и аудио периодически подавать поток контекстной информации, "хинтов". Напирмер на 7:41 сразу три таких вставки подряд - хинт о hibernate ddl-auto, хинт о теме Intellij, хинт о переходе к следующему разделу. Ещё через 15 секунд - хинт о changelog и за ним хинт о форматах changelog. На 8:55 твориться вообще что-то невероятное). Всегда смотрю видео на х2 и все равно не хватает концентрации - чувствую, как мой мозг проставивает и приходится замедляться до скорости повествования. В этот раз ощущения почти не было. Спасибо.
Спасибо, сегодня начал с этим делом разбираться. В другом туториале увидел, что в changeSet можно использовать path - путь к файлу sql, где уже будут описаны запросы к БД, там нагляднее и привычнее, чем через структуру yml файла как по мне. И еще можно ставить Теги, чтобы по ним откатываться например.
да, все верно, можно писать SQL код и его использовать, так как таких примеров достаточно был выбран пример на yaml. Про ролбеки будет позже, это важно)
Константин, не думали записать цикл видосов про микросервисы? Можно сделать на VirtualBox несколько микросервисов добавить туда gRPC. Docker, OpenShift и сякоразно )) есть идея, но не хватает экспертизы. Можно обсудить лично если интересно? Будет много подписчиков сразу) Аналогичных обучалок не встречал. Материал Liquibase + Spring Boot классно сделан!!
Спасибо за оценку) Идея отличная, так как комплексных видео по технологиям и правда мало. Возможно стоит разобраться отдельно обзорно каждую. А так пишите в tg sendel, обсудим)
14.37 можно не удалять базу данных физически файлами, если она уже существует, а добавить после create Table через пробел в той же строке if not exist в файле changeset
Если миграция применилась, то повторно при перезапуске она не будет выполнена. Если при первом запуске мы удалим таблицу, если она существует и создадим новую, при выполнении changeset, то при повтороном запуске она не будет удалена, примененная миграция будет проигнорирована. А при изменении существующего changeset, просто не стартанет liquibase, так как будет нарушен порядок применения миграций. Правильно понял замечание?
Добрый день. Спасибо за видео! Все понятно. По настройке liquibase maven plugin + hibernate + spring boot нет нормального материала в интернете. Хотелось бы узнать по поводу автогенерации миграций. Хорошо бы в сочетание с Spring config.
@@rainrainov4495 по поводу уже готового проекта, тут разные подходы, мне нравится - с готовой бд сделать миграции, а так как они использовать будут IF NOT EXISTS, то миграция ляжет ок. И дальше уже развивать схему. Но тут много нюансов, в зависимости от сложности бд и структур
@@KonstantinShibkov Спасибо! С тем как генерить gangeset я разобрался. А в базу данных как добавить запись о миграции. Вручную создать две таблицы и добавить запись? Changelog-master тоже в ручную писать и ставить includAll с path аргументом? Нет автоматизированного способа? В visual study на c# писал код, там миграции генерились автоматом сами в один клик. В liquibase этого нет?
Спасибо большое! Было очень интересно. До просмотра этого видео я не понимал, что из себя представляет Миграция баз данных. Теперь ко мне пришло понимание😁 Как я понимаю, если мы используем механизм миграции, то мы навсегда отказываемся от удобной фичи Hibernate: генерировать таблицы базы данных - которая позволяет не писать самостоятельно длинные и уродливые sql запросы. В случае с Liquibase еще и необходимо изучать как писать конфигурации и миграции. Я правильно понимаю, что в реальных проектах у нас spring.jpa.hibernate.ddl-auto всегда будет none? Есть ли какие-то способы автоматической генерации changeset-ов, когда пользователь меняет сущности каким-либо образом? Как обрабатываються ситуации, когда разработчик изменил сущность, но забыл добавить новый changeset?
Да, Hibernate больше не является инициатором изменений, поэтому автоматическое изменение структуры отключаем. Да, нам надо самим писать запросы, но при этом мы четко контролируем структуру бд, какие индексы создать, настроить тонко поля, комменты и тд. Возможно генерировать changeset, с готовой бд. Например, сам поменял в UI бд - потом запустил сбор изменений и получил changeset. Примерно описано тут sendel.ru/posts/liquibase-changeset-from-database/ Если разработчик изменил сущность, а структура бд не подходит, то при запуске приложения мы упадем, тут можно пойти еще таким путем spring.jpa.hibernate.ddl-auto=validate Автоматически после изменения Entity бд не меняется через миграцию, так как суть полного контроля структуры бд.
в данном случае только схема, как и говорю в ролике - миграция не про данные в этом случае. А только поддержка актуальности схемы и фиксация ее в коде проекта. В отдельных случаях заполняют только базовые данные, например, справочники. И никак не взаимодействуют с рабочими данными.
@@KonstantinShibkov спасибо, что пояснили. То есть насколько я понимаю применяют в основном для разработки. Для деления/соединения колонки(ок) таблицы к примеру или добавление/удаление новых. Всегда можно прыгать по версиям. Но вот хорошего практического применения, чтоб наглядно игра стоила свеч, не вижу, конечно. Без миграции данных. Ну вот к примеру что такого может пойти не так при исправлении архитектуры, если ее изначально плохо сделали, ну ладно второй ведь раз они уже лучше подумают над ней (я надеюсь), чтоб откатывать обратно не пришлось. Единственное, наверное, при поиске ошибок на новой , чтобы откатить на момент когда она работала в старой схеме. Чтоб выявить че не работает сейчас. Только вот это приходит в голову. Не работал с ним никогда, и поэтому интересно часто ли она спасает
@@KonstantinShibkov Ну вот у меня есть @Entity классы у которых поля помеченны аннотациями (например @OneToMapy или там @Enumerated(EnumType.STRING)) и я настраиваю это используя spring.jpa.hibernate.ddl-auto=update что б по этим аннотациям Spring Boot мне сам сгенерировал таблицы. А используя Liquibase я получается должен это прописывать вручную.
видел способ как Liquibase отключается в конфигурации, дальше ставиться ddl-auto=create, Hibernate генерит таблицы, потом ddl-auto=none, maven плагином генерится changelog по уже созданной базе и дальше уже включается и используется Liquibase
@@Denys_Lapshyn Да, если подходить к полному разделению, то да, надо описать самому. В любом удобном формате и задать свои названия ключам и прочее и уже под них писать @Entity классы, но мы, разработчики, не любим писать руками инфраструктурные штуки, поэтому этот процесс хотим и можно упростить. Продолжение под вторым комментом)
@@Denys_Lapshyn И как раз один из способов, это при старте проекта, когда пишем с нуля, чуть упростить себе жизнь - позволить Hibernate создать таблицу, снять с нее changelog (как это сделать тут sendel.ru/posts/liquibase-changeset-from-database/ или через maven). И на одном из этапов внести правки, по названиям связей, может типы полей, если хибер выбрал не то и в коде не указаны конкретные типы. В дальнейшем обычно не такие большие изменения и уже добавить в миграцию не составляют труда)
а если мне надо создать схему, таблиц databasechangelog еще не будет, так как они должны создаться в новой схеме? liquebase создает эти таблицы (databasechangelog, databasechangeloglock) еще до скриптов миграции
Да, все верно, ликвибейс не поможет нам в этом. Если схемы нет. Но нам поможет в этом сам Spring Boot, если разместить resources/schema.sql c содержанием "CREATE SCHEMA IF NOT EXISTS mySchema;", то при запуске будет выполнен этот скрипт, до запуска миграций. В дальнейшем, новые схемы можно создавать и через ликвибейс. Более подробно как это работает и какие есть параметры конфигурации: docs.spring.io/spring-boot/docs/current/reference/html/howto.html#howto.data-initialization.using-basic-sql-scripts
Все зависимости из проекта 'org.springframework.boot:spring-boot-starter-data-jpa' 'org.springframework.boot:spring-boot-starter-web' 'org.liquibase:liquibase-core' 'com.h2database:h2' весь файл с зависимостями github.com/sendelufa/lesson-liquibase-start/blob/main/build.gradle возможно интересует как это записать в maven?
Добрый день, подскажите, пожалуйста, как можно в IntelliJ IDEA включить autocompletion при заполнении yaml changeset файлов? Вижу, что у вас работает. Спасибо.
@@nicklepikhin плагины дополнительные не стоят для этого версия. 2021.3.2 можете попробовать принудительно активировать, в yml когда находитесь, включите предложения через ctl+Space на вин/линукс или ⌃␣ на маке.
А flyway умеет? Ищу что-то, что будет автоматически синхронизировать изменения энтити с change log - ом или наоборот. А то получается пишем все руками и проверяем validate, как-то криво
Наконец-то я нашел нормальное объяснение, что такое эти ваши миграции и кто куда мигрирует. Порой складывается ощущение, что люди пользуются чем-то, но сами не понимают для чего. И потом не могут ответить на вопрос зачем эта технология вообще нужна, если и без неë можно работать. А еще раздражают не интуитивно понятные термины, которые как-будто специально придумывают, чтобы преувеличить сложность и серьезность темы. Мне как новичку очень помогло(и вставки в идеальных местах. Когда хотел уже идти гуглить, но всплывашка быстро напомнила о чëм речь) 👏
Спасибо! С терминами и правда беда, особенно с переводами на русский)
Очень качественно! Словил эстетическое удовольствие от просмотра.
Очень живое и понятное объяснение, приятные анимации, весь ролик по делу. Автору спасибо
Спасибо большое, очень понятно для начинающих.
От себя добавлю - можно использовать lombok ну и вместо постоянного захода в браузер - можно не отходя от идеи просматривать все интересующие данные
да, даже если Community есть плагины для бд и запросов:
plugins.jetbrains.com/plugin/1800-database-navigator
plugins.jetbrains.com/plugin/14723-restfulbox
Отлично оформлено видео с нужными хинтами где нужно. Приятно смотреть
Приятно было смотреть! Хороший звук и визуальная часть.
Пожалуйста не останавливайтесь. У вас крутые ролики.
Шикарная статья, язык, пояснения, исправления, ссылки, сайт. Тайминг, анимация (одна только огненная стрелка чего стоит), схемы БД.
Сразу узнал много нового и не вошёл в ступор от избытка информации
Чётко ! Спс. Монтаж топ !! Очень крутая и увлекательная фишка. Лайк с порога
Спасибо, добрый человек! Всё ясно и по полочкам. С меня Лайк и Подписка.
Спасибо большое, лучшее видео по liquabase, доступно и понятно)
Отлично 🙌 впечатлили спецэффекты)
Очень круто. Все ясно и понятно.
Спасибо большое!
Best tutorial! I wanted to see step by step creation from scratch as in our production project everything was already done. Thanks!
Гайд классный, успехов твоему каналу!
Спасибо за нормальную и полную информацию.
Костя, спасибо за видео!
крутые эффекты! приятно смотреть!!!
Учитель из будущего... Еще еще еще!
Отличное видео. Большое спасибо!
Ты просто лучший!!!
супер отличное объяснение спасибо
Отличное видео. Все анимации в тему
Задана новая планка плотности информации.
Не видел раньше подбоного - параллельно с потоками видео и аудио периодически подавать поток контекстной информации, "хинтов". Напирмер на 7:41 сразу три таких вставки подряд - хинт о hibernate ddl-auto, хинт о теме Intellij, хинт о переходе к следующему разделу. Ещё через 15 секунд - хинт о changelog и за ним хинт о форматах changelog. На 8:55 твориться вообще что-то невероятное). Всегда смотрю видео на х2 и все равно не хватает концентрации - чувствую, как мой мозг проставивает и приходится замедляться до скорости повествования. В этот раз ощущения почти не было.
Спасибо.
Классное видео и статья тоже!❤
Спасибо!
Understood Liquibase and how it works now ! spasibo!
Прекрасный видеоурок, спасибо
Спасибо, сегодня начал с этим делом разбираться.
В другом туториале увидел, что в changeSet можно использовать path - путь к файлу sql, где уже будут описаны запросы к БД, там нагляднее и привычнее, чем через структуру yml файла как по мне. И еще можно ставить Теги, чтобы по ним откатываться например.
да, все верно, можно писать SQL код и его использовать, так как таких примеров достаточно был выбран пример на yaml. Про ролбеки будет позже, это важно)
Огонь!
Спасибо!
спасибо
Классное объяснение, спасибо) Про swagger будет такое же объяснение?)
Константин, не думали записать цикл видосов про микросервисы? Можно сделать на VirtualBox несколько микросервисов добавить туда gRPC. Docker, OpenShift и сякоразно )) есть идея, но не хватает экспертизы. Можно обсудить лично если интересно? Будет много подписчиков сразу) Аналогичных обучалок не встречал. Материал Liquibase + Spring Boot классно сделан!!
Спасибо за оценку) Идея отличная, так как комплексных видео по технологиям и правда мало. Возможно стоит разобраться отдельно обзорно каждую. А так пишите в tg sendel, обсудим)
🤯
14.37 можно не удалять базу данных физически файлами, если она уже существует, а добавить после create Table через пробел в той же строке if not exist в файле changeset
Если миграция применилась, то повторно при перезапуске она не будет выполнена. Если при первом запуске мы удалим таблицу, если она существует и создадим новую, при выполнении changeset, то при повтороном запуске она не будет удалена, примененная миграция будет проигнорирована.
А при изменении существующего changeset, просто не стартанет liquibase, так как будет нарушен порядок применения миграций.
Правильно понял замечание?
@@KonstantinShibkov в целом, да.
кек) Прикольно) Встретил искомый мануал от уже знакомого человека ))
Я так понимаю про rollback ролик не вышел? =)
@@dartRichard эксперимент в тот раз на этом и закончился)
а что за плагин к идее, который подсказывает значения, например когда меняешь ddl-auto ?
это чистая ide из плагинов только vim и тема оформления. Ultimate сам подставляет предложения. версия на всякий 2021.3.2
Спасибо за урок, очень наглядно, только не нашла файлы с примерами кода на SQL и XML по данной вами ссылке в ветке result 🤔
да, вы правы, там нет этих примеров. Упустил. Добавлю и вам отвечу, спасибо что написали
7:22 В postgres сама меняет сразу
Добрый день. Спасибо за видео! Все понятно. По настройке liquibase maven plugin + hibernate + spring boot нет нормального материала в интернете. Хотелось бы узнать по поводу автогенерации миграций. Хорошо бы в сочетание с Spring config.
Генерировать на основе готовой бд или чего?
@@KonstantinShibkov На основе готовой базы данных и на основе Entity классов. Еще неплохо бы узнать как добавить liquibase в существующий проект.
@@rainrainov4495 сам ликвибейс может генерить, например так sendel.ru/posts/liquibase-changeset-from-database/
@@rainrainov4495 по поводу уже готового проекта, тут разные подходы, мне нравится - с готовой бд сделать миграции, а так как они использовать будут IF NOT EXISTS, то миграция ляжет ок. И дальше уже развивать схему. Но тут много нюансов, в зависимости от сложности бд и структур
@@KonstantinShibkov Спасибо! С тем как генерить gangeset я разобрался. А в базу данных как добавить запись о миграции. Вручную создать две таблицы и добавить запись? Changelog-master тоже в ручную писать и ставить includAll с path аргументом? Нет автоматизированного способа? В visual study на c# писал код, там миграции генерились автоматом сами в один клик. В liquibase этого нет?
Спасибо большое! Было очень интересно. До просмотра этого видео я не понимал, что из себя представляет Миграция баз данных. Теперь ко мне пришло понимание😁
Как я понимаю, если мы используем механизм миграции, то мы навсегда отказываемся от удобной фичи Hibernate: генерировать таблицы базы данных - которая позволяет не писать самостоятельно длинные и уродливые sql запросы. В случае с Liquibase еще и необходимо изучать как писать конфигурации и миграции.
Я правильно понимаю, что в реальных проектах у нас spring.jpa.hibernate.ddl-auto всегда будет none?
Есть ли какие-то способы автоматической генерации changeset-ов, когда пользователь меняет сущности каким-либо образом?
Как обрабатываються ситуации, когда разработчик изменил сущность, но забыл добавить новый changeset?
Да, Hibernate больше не является инициатором изменений, поэтому автоматическое изменение структуры отключаем. Да, нам надо самим писать запросы, но при этом мы четко контролируем структуру бд, какие индексы создать, настроить тонко поля, комменты и тд.
Возможно генерировать changeset, с готовой бд. Например, сам поменял в UI бд - потом запустил сбор изменений и получил changeset. Примерно описано тут sendel.ru/posts/liquibase-changeset-from-database/
Если разработчик изменил сущность, а структура бд не подходит, то при запуске приложения мы упадем, тут можно пойти еще таким путем
spring.jpa.hibernate.ddl-auto=validate
Автоматически после изменения Entity бд не меняется через миграцию, так как суть полного контроля структуры бд.
То есть подведя итог: мы заливаем проект с yaml'ами на Git. Ок. А миллионы данных, они мигрируются или только схема? Не понятно до конца
в данном случае только схема, как и говорю в ролике - миграция не про данные в этом случае. А только поддержка актуальности схемы и фиксация ее в коде проекта. В отдельных случаях заполняют только базовые данные, например, справочники. И никак не взаимодействуют с рабочими данными.
@@KonstantinShibkov спасибо, что пояснили. То есть насколько я понимаю применяют в основном для разработки. Для деления/соединения колонки(ок) таблицы к примеру или добавление/удаление новых. Всегда можно прыгать по версиям. Но вот хорошего практического применения, чтоб наглядно игра стоила свеч, не вижу, конечно. Без миграции данных. Ну вот к примеру что такого может пойти не так при исправлении архитектуры, если ее изначально плохо сделали, ну ладно второй ведь раз они уже лучше подумают над ней (я надеюсь), чтоб откатывать обратно не пришлось. Единственное, наверное, при поиске ошибок на новой , чтобы откатить на момент когда она работала в старой схеме. Чтоб выявить че не работает сейчас. Только вот это приходит в голову. Не работал с ним никогда, и поэтому интересно часто ли она спасает
А как же генерировать таблицы в базе по Hibernate аннотациям когда всеми изменениями в базе управляет Liquibase?
Уточните, пожалуйста, про какие аннотации речь
@@KonstantinShibkov Ну вот у меня есть @Entity классы у которых поля помеченны аннотациями (например @OneToMapy или там @Enumerated(EnumType.STRING)) и я настраиваю это используя spring.jpa.hibernate.ddl-auto=update что б по этим аннотациям Spring Boot мне сам сгенерировал таблицы. А используя Liquibase я получается должен это прописывать вручную.
видел способ как Liquibase отключается в конфигурации, дальше ставиться ddl-auto=create, Hibernate генерит таблицы, потом ddl-auto=none, maven плагином генерится changelog по уже созданной базе и дальше уже включается и используется Liquibase
@@Denys_Lapshyn Да, если подходить к полному разделению, то да, надо описать самому. В любом удобном формате и задать свои названия ключам и прочее и уже под них писать @Entity классы, но мы, разработчики, не любим писать руками инфраструктурные штуки, поэтому этот процесс хотим и можно упростить. Продолжение под вторым комментом)
@@Denys_Lapshyn И как раз один из способов, это при старте проекта, когда пишем с нуля, чуть упростить себе жизнь - позволить Hibernate создать таблицу, снять с нее changelog (как это сделать тут sendel.ru/posts/liquibase-changeset-from-database/ или через maven). И на одном из этапов внести правки, по названиям связей, может типы полей, если хибер выбрал не то и в коде не указаны конкретные типы. В дальнейшем обычно не такие большие изменения и уже добавить в миграцию не составляют труда)
а если мне надо создать схему, таблиц databasechangelog еще не будет, так как они должны создаться в новой схеме? liquebase создает эти таблицы (databasechangelog, databasechangeloglock) еще до скриптов миграции
Да, все верно, ликвибейс не поможет нам в этом. Если схемы нет.
Но нам поможет в этом сам Spring Boot, если разместить resources/schema.sql c содержанием "CREATE SCHEMA IF NOT EXISTS mySchema;", то при запуске будет выполнен этот скрипт, до запуска миграций. В дальнейшем, новые схемы можно создавать и через ликвибейс.
Более подробно как это работает и какие есть параметры конфигурации: docs.spring.io/spring-boot/docs/current/reference/html/howto.html#howto.data-initialization.using-basic-sql-scripts
какая тема в идеа, товарищи? подскажите! вопрос жизни и смерти!
лайк, подписка!! голос супер! пока не досмотрел, объяснение не могу оценить!!!
нашел в видео пасхалку! приятно!
Подскажите, как включить автозаполнение в yaml файлах как у вас?
Это стандартная возможность для Idea Ultimate. У вас какая версия редактора?
@@KonstantinShibkov Ultimate
@@uamurphy попробуйте поставить плагин plugins.jetbrains.com/plugin/23741-liquibase
@@KonstantinShibkov спасибо, буду пробовать)
какие dependency было испольэзвано?
Все зависимости из проекта
'org.springframework.boot:spring-boot-starter-data-jpa'
'org.springframework.boot:spring-boot-starter-web'
'org.liquibase:liquibase-core'
'com.h2database:h2'
весь файл с зависимостями github.com/sendelufa/lesson-liquibase-start/blob/main/build.gradle
возможно интересует как это записать в maven?
Добрый день, подскажите, пожалуйста, как можно в IntelliJ IDEA включить autocompletion при заполнении yaml changeset файлов? Вижу, что у вас работает. Спасибо.
А у вас версия Ultimate или Community?
@@KonstantinShibkov ultimate
@@nicklepikhin плагины дополнительные не стоят для этого версия. 2021.3.2
можете попробовать принудительно активировать, в yml когда находитесь, включите предложения через ctl+Space на вин/линукс или ⌃␣ на маке.
В базу данных добавить строки с id null не получилось. Ошибка id не может быть null.
Можете уточнить на каком этапе или часть кода скинуть
@@KonstantinShibkov
@Entity
@Data
public class Author {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "fullname", nullable = false)
private String name;
}
@@KonstantinShibkov
databaseChangeLog:
- changeSet:
id: change-column-author
author: kon
changes:
- renameColumn:
tableName: author
oldColumnName: name
newColumnName: fullname
@@KonstantinShibkov
org.springframework.boot
spring-boot-starter-parent
3.1.4
com.sendel
lesson-liquabase-start
0.0.1-SNAPSHOT
lesson-liquabase-start
Liquibase
17
org.springframework.boot
spring-boot-starter-data-jpa
org.springframework.boot
spring-boot-starter-validation
org.springframework.boot
spring-boot-starter-web
org.liquibase
liquibase-core
com.h2database
h2
runtime
org.projectlombok
lombok
true
org.springframework.boot
spring-boot-starter-test
test
org.springframework.boot
spring-boot-maven-plugin
org.projectlombok
lombok
в файле миграции название поля в таблице поменяли, а в entity Author забыли.
для новичков - ликвибейз не умеет entity обновлять
А flyway умеет? Ищу что-то, что будет автоматически синхронизировать изменения энтити с change log - ом или наоборот. А то получается пишем все руками и проверяем validate, как-то криво
Есть команда, которая сможет сгенерировать данные таблиц в файл liquibase-outputChangeLog.xml? На подобии этой команды generateChangeLog
Можно через мавен команду или отдельно запускать ее, описал это тут sendel.ru/posts/liquibase-changeset-from-database/
спасибо, Константин. кратко и понятно
Спасибо!
спасибо