当前现状
- 需要单独保存sql脚本
- 只能通过人工控制sql只执行一次
- 需要知道sql脚本执行版本,只能通过sql脚本存放目录进行确认
- 需要搭建新环境时,只能将线上数据库进行copy
解决方案
使用linquibase工具
liquibase
我眼中的liquibase
- liquibase其实就是一套db工具,类似hibernate的bean-xml,通过封装,将不同数据库的DML操作统一成一套语言,在有多个不同数据库(比如mysql, postgresql, oracle)时,能够实现一套代码到处建库(有木有一点像java)
- 提供数据库可持续集成交付,一旦changeSet被执行过,就不会再被执行(保证了只会执行一次),且也不允许再修改changeSet,否则由于计算出的md5值与之前的md5值不一致,在执行时就会报错失败。
项目搭建
-
配置maven环境,修改/etc/profile文件,加入以下语句,并执行
source /etc/profile
使配置生效MAVEN_HOME=/home/zhangj/maven/apache-maven-3.3.9 export MAVEN_HOME export PATH=${PATH}:${MAVEN_HOME}/bin
-
在项目pom文件中引入liquibase相关plugin
<!--liquibase插件--> <plugin> <groupId>org.liquibase</groupId> <artifactId>liquibase-maven-plugin</artifactId> <version>3.0.5</version> <configuration> <promptOnNonLocalDatabase>false</promptOnNonLocalDatabase> <propertyFile>src/main/resources/liquibase.properties</propertyFile> </configuration> </plugin> <!--用于打包项目--> <plugin> <artifactId>maven-assembly-plugin</artifactId> <version>3.0.0</version> <configuration> <descriptorRefs> <descriptorRef>src</descriptorRef> </descriptorRefs> </configuration> <executions> <execution> <id>make-assembly</id> <!-- this is used for inheritance merges --> <phase>package</phase> <!-- bind to the packaging phase --> <goals> <goal>single</goal> </goals> </execution> </executions> </plugin>
-
将打好的src包,丢到刚刚配置好的maven环境中,执行
mvn liquibase:update
就可以看到,你所写的changeSet被执行啦