在團隊開發當中,有可能每個人都是使用自己本地的數據庫。當數據庫的表或者字段更新時,往往需要告知團隊的其他同事進行更新。我記得第一個項目進行字段管理的時候是將自己的腳步拿出來放到項目某個文件夾下面,如果結構變了告訴其他同事拉下來之后執行下腳本文件。還有一種方式是改完之后告訴其他人哪個表字段做了改動,腳本都沒放,這種方式也使用過···
Flyway數據庫版本遷移工具可以解決該問題。每當我們更新數據庫的時候,只需要添加SQL文件到指定目錄中。
Flyway的流程大概是在數據庫創建一個表,專門記錄已更新的SQL文件。當我們下次執行時則不會執行已記錄並且執行成功的SQL文件,如果沒有執行過sql腳本會執行腳本並且記錄到自己的表中。這種方式對開發、對線上系統的升級就非常方便了。當然flyway還有其他非常方便的功能,都是可以配置的。
github地址:https://github.com/flyway/flyway
而且我記得之前在一個項目是mybatisPlus些的,為了便於建表還引入了JPA進行建表,其實用flyway也可以,放一個初始化腳步,系統啟動的時候自動執行腳步即可。
flyway使用可以命令行、Java、Maven等,也和spring做了整合。下面研究在springboot項目中的使用。
1. pom引入相關依賴
<dependency> <groupId>org.flywaydb</groupId> <artifactId>flyway-core</artifactId> <version>6.3.3</version> </dependency>
2.application配置
# FLYWAY (FlywayProperties) spring.flyway.url = jdbc:mysql://127.0.0.1:3306/media?useUnicode=true&characterEncoding=UTF-8 spring.flyway.user = root spring.flyway.password = 123456 # 存放flyway信息的表 spring.flyway.table = flyway_schema_history spring.flyway.enabled = true # 存放數據庫腳本的位置 spring.flyway.locations = classpath:db/migration spring.flyway.clean-disabled = false spring.flyway.baseline-on-migrate = true # 允許亂序執行 spring.flyway.out-of-order= true # 前綴后綴 spring.flyway.sql-migration-prefix=V spring.flyway.sql-migration-separator=__ spring.flyway.validate-on-migrate=false
上面配置了數據庫連接信息;
spring.flyway.table 指定存放flyway記錄版本信息的表;
spring.flyway.locations 指定存放腳本文件的位置。classpath在boot項目中就是resources目錄
sql-migration-prefix和sql-migration-separator指定版本前綴和版本號和描述的分隔符
關於更多的配置參考:https://flywaydb.org/documentation/configuration/configfile
3. 建立sql文件
這里說明下sql文件的命名。V版本號__描述.sql 版本號默認是1 (注意這里的下划線是兩個),而且版本號不能重復。描述就是你本次sql改動是做什么了簡單說明下。
4.啟動項目自動建表
啟動項目可以看到自動建的表。
test是從腳本中讀出來的,flyway_schema_history是flyway運行自身所需要的表,用於記錄處理過的數據表。查看數據如下:
5.執行第二個SQL
如果這時候你想刪掉test表,你刪掉表 V20201106001__創建test表.sql 是沒用的,因為flyway已經處理過該文件,不會進行處理。解決辦法就是加一個文件做一個逆向的操作。如下:
在db/migration目錄下新建第二個SQL文件,名稱為: V20201106002__刪除test表.sql ,內容如下:
drop table test
啟動項目讓flyway執行腳本。
再次查看數據表test已經刪除
查看flyway_schema_history表的數據如下:
補充:flyway 腳本執行失敗的話會導致服務啟動失敗,success 為 0 的時候,修改正確之后不會重新加載腳本,需要刪掉flyway記錄表的那條數據。