为什么要使用数据库版本管理
弱鸡面对数据库,都是这样的:
- 手工变更数据库
- 不能与团队的其他成员分享数据库变更
- 使用不一致的方法变更数据库或数据
- 使用低效的手工方法管理数据库版本之间的变更
当然啦,有些队友会用Sybase PowerDesigner。还有一些无人能挡的队友,直接用PD连接数据库,根据表结构设计自动生成表。
这种做法我以前也用过,但是PD保存的是二进制文件,无法用git做版本对比,很不爽。
后来直接把各种SQL写成文件,放在项目下。这么做的缺点是缺乏标准。遇到不会开黑的队友直接就无视了。
以下是两个用于数据库重构和迁移的开源工具,通过日志文件的形式记录数据库的变更,然后执行日志文件中的修改,将数据库更新或回滚到一致的状态。
Flyway和Liquibase比较
相同点
- 都支持主流那几个数据库
- 都提供了命令行,API,maven,gradle等等工具
不同点
Flyway
- 版本是用文件名管理的,如:V1_file.sql, V2_file.sql …
- 版本文件基于SQL的,所以如果不需要考虑切换数据库,可以写基于数据库特性的SQL,并且支持PL/SQL,T-SQL
- 基于Java的,个性化扩展很容易
Liquibase
- 版本管理的方式是指定Id和Author,会在数据库中插入表DATABASECHANGELOG,DATABASECHANGELOGLOCK,记录版本信息。
- 版本文件基于多种格式:xml, yaml, json, sql。XML有定义好的Schema,使用指定的tag来定义SQL,需要切换数据库的很容易,liquibase可以把XML翻译成指定的SQL。
- 如果想用sql格式的版本文件,建议直接考虑Flyway。因为你可能引入数据库相关的SQL语法。
- Liquibase最方便的地方是能迁移现有的数据库。也就是说,你在项目的任何时候都可以用上Liquibase。
所以感觉这两个的区别,就很像Hibernate和Mybatis,没有最好,只有最合适。
Liquibase使用
spring-boot中使用
spring-boot 直接支持Flyway和Liquibase。
在项目中加入Liquibase的依赖:
<dependency>
<groupId>org.liquibase</groupId>
<artifactId>liquibase-core</artifactId>
</dependency>
在application.properties文件中,加入以下配置:
liquibase.change-log = classpath:/db/changelog/db.changelog-master.yaml
liquibase.url = jdbc:mysql://localhost:3306/db?useSSL=false
liquibase.user = username
liquibase.password = password
如果你的 liquibase.change-log 这一行跟上边一摸一样,就可以直接删掉。
maven中使用
在项目中加入liquibase-maven-plugin插件:
<build>
<pluginManagement>
<plugins>
<!-- liquibase maven plugin -->
<plugin>
<groupId>org.liquibase</groupId>
<artifactId>liquibase-maven-plugin</artifactId>
<version>3.5.3</version>
<configuration>
<propertyFile>liquibase.properties</propertyFile>
</configuration>
<executions>
<execution>
<phase>process-resources</phase>
<goals>
<goal>update</goal>
<goal>tag</goal>
<goal>rollback</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</pluginManagement>
</build>
使用的命令是:
动作 | 命令 |
---|---|
更新 | mvn liquibase: update |
打标签 | |
回滚 |
这个配置官网都有教程,有一点需要说明,这里需要加上<pluginManagement>这个标签,官网上没有。如果不加会怎样呢?会报如下错误:
Plugin execution not covered by lifecycle configuration: org.liquibase:liquibase-maven-plugin:3.0.5:update
别问我为什么,自己学 Maven。
其他
How to write change log file, and how to use migrate and rollback?
直接看官网教程,很简单,看完就超神了。