Liquibase+SpringBoot的簡單使用筆記!update+rollback
2020-11-06 01:32:17
liquibase+springboot
liquibase
springboot
使用
update+rollback
*該筆記記錄了springboot整合liquibase之後,如何根據liquibase ChangeLogFile對資料庫進行修改以及回滾操作* 參考: [baeldung.com](https://www.baeldung.com/liquibase-rollback) [JHipster](https://www.jhipster.tech/) ### 1. 利用changeLog檔案對資料庫進行修改 1. 引入liquibase依賴 2. 在resource目錄下新建db.changelog-master.xml作為變更集檔案 3. 修改application加入liquibase的配置,主要配置變更集檔案位置 4. 執行專案,即可根據變更集檔案的內容對資料庫進行修改 **master.xml簡單格式:** ```xml ``` ### 2. 從現有資料庫表生成changeLog檔案 1. 在資料庫中建表 2. 新建一個liquibase.properties並配置資料庫地址、使用者名稱密碼、驅動 3. 在有liquibase.properties的目錄下開啟cmd,輸入命令 ``` liquibase --changeLogFile=dbchangelog.xml generateChangeLog ``` 會自動生成一個dbchangelog.xml的目標檔案 Liquibase可根據目標檔案字尾名生成對應型別的變更集檔案,如.yaml會生成yaml格式的 **liquibase.properties:** ```xml # 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檔案 1. 新建一個專案,引入jpa依賴 2. 修改application,配置jpa的ddl-auto屬性為create 3. 新建實體類 4. 將專案打包成jar檔案 5. 在jar檔案目錄下,新建liquibase.properties並配置相應的屬性 6. 在該目錄開啟cmd,輸入命令 ``` Liquibase --logLevel=INFO --defaultsFile=liquibase.properties generateChangeLog ``` 即可自動生成dbchangelog.xml檔案 **Liquibase.properties:** ```xml # 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和更改集檔案一致。 1. 在專案中,resource目錄下配置master.xml主變更集檔案,目的是將子更改集include進來 ```xml ``` 2. 新建202011051610-added-person.xml子變更集檔案,位置為src\main\resources\db\changelog\db.changelog-master.xml ```xml ``` 3. 修改pom.xml,為maven增加liquibase外掛 ```xml ``` 4. 執行專案,可以發現liquibase會自動建立資料庫表 5. 執行回滾操作,在命令列中利用maven命令 ```mvn liquibase:rollback -Dliquibase.rollbackCount=1``` 6. 利用maven執行變更集任務可以使用命令 ```mvn liquibase:update``` **已知問題:** 在springBoot中,由於*liquibase update*是由springBoot完成的,手動在命令列中對該changeLog執行回滾操作,雖然會提示成功,但是資料庫中的資料實際沒有發生回滾。 **原因:** springBoot中changelogFile位置為classpath:db/changelog/db.changelog-master.xml 而在命令列中,無法將檔案位置表示為classpath:的形式,檔名字不同會被liquibase認為是不同的版本管理 **解決方法:** 將changeSet定義在子變更集中,在主變更集中引入子變更集,這樣不管在什麼環境裡,changeSet的路徑都被表示為在主變更集中配置的一樣,從而避免了路徑不同的