liqiubase_demo

View on GitHub

Настройки проекта и подключение liquibase

Нужно быть внимательными Hibernate и liquibase генерят немного разные названия колонок. При накатывании changeset колонка дропнется вместе со всеми данными

Лучше всего при подключении liquibase на существующий проект добиться чтобы при первом diff changeset был пуст

Для устранения неоднозначностей навешиваем аннотации @Column(name = “…”) на поля Entity

Настройки в файл application.properties

spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver  
spring.datasource.url=jdbc:mysql://localhost:3306/my_db?createDatabaseIfNotExist=true&allowPublicKeyRetrieval=true&useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC  
spring.datasource.username=root  
spring.datasource.password=  
  
spring.jpa.show-sql=true  
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5Dialect  
spring.jpa.hibernate.ddl-auto=none (или verify)

Добавляем в pom.xml зависимость

<dependency>  
	<groupId>org.liquibase</groupId>  
	<artifactId>liquibase-core</artifactId>  
</dependency>

Теперь необходимо добавить сам Liquibase скрипт, который будет создавать нужную нам таблицу. Создаем в папке /src/main/resources/db/changelog файл с именем db.changelog-master.yaml и добавляем в него следующее содержимое

Open spoiler ```java databaseChangeLog: - logicalFilePath: db/changelog/db.changelog-lesson1.yaml - changeSet: id: 1 author: your_liquibase_username changes: - createTable: tableName: users columns: - column: name: id type: BIGINT autoIncrement: true constraints: primaryKey: true nullable: false - column: name: username type: varchar(50) constraints: unique: true nullable: false - column: name: password type: varchar(512) constraints: nullable: false - column: name: first_name type: varchar(50) - column: name: last_name type: varchar(50) - column: name: email type: varchar(50) ```

Это если создавать БД с чистого листа и changeset-ами. Но задача стоит немного иначе. Уже есть схема БД созданная Hibernate-ом по Entity Нужно создавать changeset по измененным Entity, а потом получившийся diff - changeset накатывать на БД с помощью liquibase

Для этого добваляем maven-plugin

секция build файла pom.xml ``` src/main/resources true *.properties src/main/resources false **/*.* org.springframework.boot spring-boot-maven-plugin org.liquibase liquibase-maven-plugin 3.5.5 ${project.build.outputDirectory}/liquibase-maven-plugin.properties your_liquibase_username info org.liquibase.ext liquibase-hibernate5 3.6 org.springframework.boot spring-boot-starter-data-jpa 2.1.5.RELEASE javax.validation validation-api 2.0.1.Final org.javassist javassist 3.24.0-GA org.yaml snakeyaml 1.12 ```
Файл pom.xml целиком ``` 4.0.0 org.springframework.boot spring-boot-starter-parent 2.5.3 com.example liquibase_demo 0.0.1-SNAPSHOT liquibase_demo Demo project for Spring Boot 11 ${maven.build.timestamp} yyyyMMdd-HHmmssSSS org.springframework.boot spring-boot-starter-data-jpa org.springframework.boot spring-boot-starter-web mysql mysql-connector-java runtime org.springframework.boot spring-boot-starter-test test org.projectlombok lombok 1.18.20 provided org.liquibase liquibase-core src/main/resources true *.properties src/main/resources false **/*.* org.springframework.boot spring-boot-maven-plugin org.liquibase liquibase-maven-plugin 3.5.5 ${project.build.outputDirectory}/liquibase-maven-plugin.properties your_liquibase_username info org.liquibase.ext liquibase-hibernate5 3.6 org.springframework.boot spring-boot-starter-data-jpa 2.1.5.RELEASE javax.validation validation-api 2.0.1.Final org.javassist javassist 3.24.0-GA org.yaml snakeyaml 1.12 ```

Убедимся что есть директория src/main/resources/db/changelog

В resources нужен файл liquibase-maven-plugin.properties с настройками плагина.

changeLogFile= @project.basedir@/src/main/resources/db/changelog/db.changelog-master.yaml
url= jdbc:mysql://localhost:3306/geek_db?createDatabaseIfNotExist=true&allowPublicKeyRetrieval=true&useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
username= root
password=
driver= com.mysql.cj.jdbc.Driver
referenceUrl=hibernate:spring:com.example.liquibase_demo.model?dialect=org.hibernate.dialect.MySQLDialect
diffChangeLogFile= @project.basedir@/src/main/resources/db/changelog/db.changelog-@timestamp@.yaml
ignoreClasspathPrefix= true

Обращаем внимание на правильность пакетного пути до наших Entity в параметре referenceUrl В файле db.changelog-master.yaml перед первым запуском не должно быть changeset-ов, чтобы не убить существующую схему БД. Запускаем:

Это удобно вызывать из меню mavem справа вверху в idea.

Если Entity и схема БД у нас разные (мы добавили/исправили Entity) в папке src/main/resources/db/changelog у нас появится diff-файл с changeset-ом Этот changeset после проверки необходимо накатить на БД. Для этого инклюдим его в db.changelog-master.yaml Например:

- include:
      file: db.changelog-20210729-054643592.yaml
      relativeToChangelogFile: true

Перезапускаем приложение изменения должны накатиться на БД.

В итоге получаем такую схему:

  1. Изменяем/добавляем Entity
  2. Получаем diff-файл с changeset-ом
  3. Инклюдим cangeset в db.changelog-master.yaml и перезапускаем приложение
  4. Изменения накатываются на БД

Links:

https://habr.com/ru/post/460377/

https://habr.com/ru/post/460907/