5

引言

最近重拾了计量项目,几个月不写,发现有好多的新知识需要学习。

为了实现数据库的版本迁移,几乎所有的生产项目都用上了flyway,但是华软项目至今没有配置。便决定拿出一个晚上学习并配置flyway

尝试

设计

之前为了项目的方便快捷,一直使用的是HibernateDDL进行数据表结构的维护。

DDLData Definition Language,数据定义语言。

但是奈何在实际的生产项目中,HibernateDDL表现不尽如人意,为了不冒意外的风险,决定禁用HibernateDDL,所有的数据表结构变更交给flyway去维护。使用sql维护表结构。

引入依赖

mavenpom.xml中引入对flyway的依赖。

<!-- flyway -->
<dependency>
    <groupId>org.flywaydb</groupId>
    <artifactId>flyway-core</artifactId>
</dependency>

mavengroupIdartifactId以及version唯一确定一个maven项目,但是这里为什么不需要指明版本号呢?在上次我和潘佳琦一起学习中找到了答案。

spring-boot项目依赖于spring-boot-dependencies项目,该项目中管理了所有被spring-boot整合过的技术的版本号。

clipboard.png

去文件内搜索flyway,即找到相关的配置<flyway.version>5.0.7</flyway.version>

spring-boot规定好了,如果你用的是spring-boot 2.0.5.RELEASE版本,那建议使用flyway:5.0.7

clipboard.png

这样管理一是方便,还有一个原因我觉得是避免冲突。

当引入多个包的时候,就可能会出现版本冲突,我相信,spring-boot肯定是将这些版本经过测试的,保证了无冲突才会推荐使用这些版本的。

禁用hibernate ddl

clipboard.png

hibernateddl-auto有五个值可供配置。

createcreate-dropupdate这些常见的我就不多介绍了。

none:禁用hibernate ddl

validate:验证数据库,但是保证不对数据库做任何修改。

这里我选择使用validate,可以保证数据表是经过hibernate验证的,保证不会启动成功了,但因数据库的原因在运行的时候出问题。

spring:
  jpa:
    hibernate:
      ddl-auto: validate

启用flyway

spring.flyway.enabled设置为true,以启用flyway

spring:
  flyway:
    enabled: true

导出SQL

直接用之前生成过的数据库导出,Navicat转储SQL文件,导出数据表结构。

clipboard.png

Navicat导出的SQL不能直接放进spring-boot中运行。

  1. 数据表因为有外键,所以有建表的先后顺序问题。
  2. Navicat导出的SQL有些语法会报错,根据spring-boot提示的报错信息,将报错位置改成标准SQL即可。

将初始化SQL移动到项目的resources/db/migration目录下,这是flyway的默认扫描目录。

clipboard.png

文件命名符合下图的规范,V表示版本,版本号,分隔符,描述。

clipboard.png

测试

运行项目,数据表创建成功。flyway_schema_history中记录了此次的执行信息。

clipboard.png

注意

因为禁用了hibernateddl,所以以后的开发中,如果需要修改数据表的结构时:

  1. 修改实体,修改字段。
  2. 编写SQL,版本迁移。

总结

之前一直是看潘老师配置的flyway,这次自己亲自配置,还是遇到了许多问题的。

尝试的过程中,也尝试了一些错误的方向,最终总结出本文,希望对你有所帮助。


张喜硕
2.1k 声望423 粉丝

浅梦辄止,书墨未浓。