flyway-实践

52次阅读

共计 1526 个字符,预计需要花费 4 分钟才能阅读完成。

引言

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

为了实现数据库的版本迁移,几乎所有的生产项目都用上了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 整合过的技术的版本号。

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

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

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

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

禁用 hibernate ddl

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 文件,导出数据表结构。

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

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

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

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

测试

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

注意

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

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

总结

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

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

正文完
 0