Современные системы учёта как правило имеют довольно сложную структуру базы данных. Несколько десятков таблиц, связей между ними, хранимых процедур. И с каждым обновлением эта структура меняется: добавляются новые поля, таблицы, некоторые удаляются. Со временем становится сложно уследить за тем, в каком состоянии находится база данных в production и development, особенно если отсутствует какая-либо информация о версии базы данных.
Задачу версионирования структуры базы данных и поддержания её в актуальном состоянии можно облегчить с помощью библиотеки Flyway.
Для подключения библиотеки к Maven проекту нужно добавить зависимость:
1 2 3 4 5 6 |
<!-- Database migration tool --> <dependency> <groupId>org.flywaydb</groupId> <artifactId>flyway-core</artifactId> <version>3.2.1</version> </dependency> |
Теперь в root-context нужно добавить бин, который будет заниматься миграцией базы данных:
1 2 3 4 5 6 7 8 9 |
<!-- Database migration tool --> <bean id="flyway" class="org.flywaydb.core.Flyway" init-method="migrate"> <property name="dataSource" ref="dataSource" /> <property name="locations"> <list> <value>db/migration</value> </list> </property> </bean> |
Также рекомендуется поставить в зависимость фабрику менеджеров сущностей от Flyway, чтобы она точно запускалась после обновления структуры базы данных.
1 2 3 |
<bean class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" id="entityManagerFactory" depends-on="flyway"> ... </bean> |
Скрипты по миграции базы данных нужно создавать в src/main/resources/db/migration. Они должны иметь название вида V1__some_name1.sql, V2__another_name.sql… То есть V<Номер версии><два подчёркивания><имя скрипта>.sql. Flyway при каждом запуске приложения будет смотреть текущее состояние базы данных и запускать скрипты с номерами версий, которые ещё не выполнялись в порядке очерёдности номеров версий.
Flyway создаёт таблицу schema_version на базе данных. В ней можно посмотреть, какие скрипты когда были выполнены.
Если Flyway нужно подключить к уже существующему проекту, то таблицу нужно будет создать вручную и добавить туда одну строчку с первой версией. В дальнейшем все обновления делать через скрипты миграций в src/main/resources/db/migration.
Сайт проекта: