Liquibase+SpringBoot的簡單使用筆記!update+rollback
阿新 • • 發佈:2020-11-05
該筆記記錄了springboot整合liquibase之後,如何根據liquibase ChangeLogFile對資料庫進行修改以及回滾操作
參考:
baeldung.com
JHipster
1. 利用changeLog檔案對資料庫進行修改
- 引入liquibase依賴
- 在resource目錄下新建db.changelog-master.xml作為變更集檔案
- 修改application加入liquibase的配置,主要配置變更集檔案位置
- 執行專案,即可根據變更集檔案的內容對資料庫進行修改
master.xml簡單格式:
<?xml version="1.1" encoding="UTF-8" standalone="no"?> <databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext" xmlns:pro="http://www.liquibase.org/xml/ns/pro" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd http://www.liquibase.org/xml/ns/pro http://www.liquibase.org/xml/ns/pro/liquibase-pro-3.10.xsd http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.10.xsd"> <changeSet author="chunmiaoz (generated)" id="1604474279717-1"> <createTable tableName="user"> <column name="id" type="BIGINT"> <constraints nullable="false" primaryKey="true"/> </column> <column name="phone" type="VARCHAR(11)"/> <column name="username" type="VARCHAR(255)"> <constraints nullable="false"/> </column> </createTable> </changeSet> </databaseChangeLog>
2. 從現有資料庫表生成changeLog檔案
- 在資料庫中建表
- 新建一個liquibase.properties並配置資料庫地址、使用者名稱密碼、驅動
- 在有liquibase.properties的目錄下開啟cmd,輸入命令
liquibase --changeLogFile=dbchangelog.xml generateChangeLog
會自動生成一個dbchangelog.xml的目標檔案
Liquibase可根據目標檔案字尾名生成對應型別的變更集檔案,如.yaml會生成yaml格式的
liquibase.properties:
# Enter the path for your changelog file. changeLogFile=dbchangelog.xml #### Enter the Target database 'url' information #### url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&useSSL=false&useLegacyDatetimeCode=false&serverTimezone=UTC&createDatabaseIfNotExist=true # Enter the username for your Target database. username: root # Enter the password for your Target database. password: 123456
3. 從使用JPA匯出的jar包生成changeLog檔案
- 新建一個專案,引入jpa依賴
- 修改application,配置jpa的ddl-auto屬性為create
- 新建實體類
- 將專案打包成jar檔案
- 在jar檔案目錄下,新建liquibase.properties並配置相應的屬性
- 在該目錄開啟cmd,輸入命令
Liquibase --logLevel=INFO --defaultsFile=liquibase.properties generateChangeLog
即可自動生成dbchangelog.xml檔案
Liquibase.properties:
# jar包地址 classpath=liquibase-demo-0.0.1-SNAPSHOT.jar # Enter the path for your changelog file. changeLogFile=dbchangelog.xml #### Enter the Target database 'url' information #### url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&useSSL=false&useLegacyDatetimeCode=false&serverTimezone=UTC&createDatabaseIfNotExist=true # Enter the username for your Target database. username: root # Enter the password for your Target database. password: 123456
4. 回滾Liquibase生成的資料庫
利用liquibase的命令
liquibase update
生成的資料庫表單,可以利用命令使資料庫回滾
liquibase rollbackCount 1 //回滾一條記錄
liquibase rollbackToDate YYYY-MM-DD HH:MM:SS //回滾到指定日期
5. Springboot整合的liquibase回滾操作
通過借鑑jhipster的liquibase配置結構完成此功能
前提:liquibase回滾時,要求databasechangelog和更改集檔案一致。
- 在專案中,resource目錄下配置master.xml主變更集檔案,目的是將子更改集include進來
<?xml version="1.1" encoding="UTF-8" standalone="no"?>
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext" xmlns:pro="http://www.liquibase.org/xml/ns/pro" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd http://www.liquibase.org/xml/ns/pro http://www.liquibase.org/xml/ns/pro/liquibase-pro-3.10.xsd http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.10.xsd">
<include file="db/changelog/202011051610-added-person.xml" relativeToChangelogFile="false"></include>
</databaseChangeLog>
- 新建202011051610-added-person.xml子變更集檔案,位置為src\main\resources\db\changelog\db.changelog-master.xml
<?xml version="1.1" encoding="UTF-8" standalone="no"?>
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext" xmlns:pro="http://www.liquibase.org/xml/ns/pro" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd http://www.liquibase.org/xml/ns/pro http://www.liquibase.org/xml/ns/pro/liquibase-pro-3.10.xsd http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.10.xsd">
<changeSet author="chunmiaoz (generated)" id="1604474279717-1">
<createTable tableName="user">
<column name="id" type="BIGINT">
<constraints nullable="false" primaryKey="true"/>
</column>
<column name="phone" type="VARCHAR(11)"/>
<column name="username" type="VARCHAR(255)">
<constraints nullable="false"/>
</column>
</createTable>
</changeSet>
<changeSet id="202011041617-added-person" author="Chunmiao">
<createTable tableName="person">
<column name="id" type="INT">
<constraints primaryKey="true" nullable="false" unique="true" ></constraints>
</column>
<column name="name" type="VARCHAR(255)">
<constraints nullable="false"></constraints>
</column>
<column name="address" type="VARCHAR(255)"></column>
<column name="city" type="VARCHAR(255)"></column>
</createTable>
</changeSet>
<changeSet id="202011041621-added-company" author="Chunmiao">
<createTable tableName="company">
<column name="id" type="INT">
<constraints primaryKey="true" nullable="false" unique="true"></constraints>
</column>
<column name="name" type="VARCHAR(255)">
<constraints nullable="false"></constraints>
</column>
<column name="address" type="VARCHAR(255)"></column>
<column name="city" type="VARCHAR(255)"></column>
</createTable>
</changeSet>
<changeSet id="202011041621-alert-person" author="Chunmiao">
<addColumn tableName="person">
<column name="country" type="VARCHAR(2)">
</column>
</addColumn>
<rollback>
<dropColumn tableName="person" columnName="country"></dropColumn>
</rollback>
</changeSet>
</databaseChangeLog>
- 修改pom.xml,為maven增加liquibase外掛
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.liquibase</groupId>
<artifactId>liquibase-maven-plugin</artifactId>
<configuration>
<changeLogFile>${basedir}/src/main/resources/db/changelog/db.changelog-master.xml</changeLogFile>
<url>jdbc:mysql://localhost:3306/test?serverTimezone=GMT%2B8</url>
<username>root</username>
<password>123456</password>
</configuration>
</plugin>
</plugins>
- 執行專案,可以發現liquibase會自動建立資料庫表
- 執行回滾操作,在命令列中利用maven命令
mvn liquibase:rollback -Dliquibase.rollbackCount=1
- 利用maven執行變更集任務可以使用命令
mvn liquibase:update
已知問題:
在springBoot中,由於liquibase update是由springBoot完成的,手動在命令列中對該changeLog執行回滾操作,雖然會提示成功,但是資料庫中的資料實際沒有發生回滾。
原因:
springBoot中changelogFile位置為classpath:db/changelog/db.changelog-master.xml
而在命令列中,無法將檔案位置表示為classpath:的形式,檔名字不同會被liquibase認為是不同的版本管理
解決方法:
將changeSet定義在子變更集中,在主變更集中引入子變更集,這樣不管在什麼環境裡,changeSet的路徑都被表示為在主變更集中配置的一樣,從而避免了路徑不同的衝突