引言
最近重拾了计量项目,几个月不写,发现有好多的新知识需要学习。
为了实现数据库的版本迁移,几乎所有的生产项目都用上了flyway
,但是华软项目至今没有配置。便决定拿出一个晚上学习并配置flyway
。
尝试
设计
之前为了项目的方便快捷,一直使用的是Hibernate
的DDL
进行数据表结构的维护。
DDL
:Data Definition Language
,数据定义语言。
但是奈何在实际的生产项目中,Hibernate
的DDL
表现不尽如人意,为了不冒意外的风险,决定禁用Hibernate
的DDL
,所有的数据表结构变更交给flyway
去维护。使用sql
维护表结构。
引入依赖
在maven
的pom.xml
中引入对flyway
的依赖。
<!-- flyway -->
<dependency>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-core</artifactId>
</dependency>
maven
的groupId
、artifactId
以及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
hibernate
的ddl-auto
有五个值可供配置。
create
、create-drop
、update
这些常见的我就不多介绍了。
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
中运行。
- 数据表因为有外键,所以有建表的先后顺序问题。
-
Navicat
导出的SQL
有些语法会报错,根据spring-boot
提示的报错信息,将报错位置改成标准SQL
即可。
将初始化SQL
移动到项目的resources/db/migration
目录下,这是flyway
的默认扫描目录。
文件命名符合下图的规范,V
表示版本,版本号,分隔符,描述。
测试
运行项目,数据表创建成功。flyway_schema_history
中记录了此次的执行信息。
注意
因为禁用了hibernate
的ddl
,所以以后的开发中,如果需要修改数据表的结构时:
- 修改实体,修改字段。
- 编写
SQL
,版本迁移。
总结
之前一直是看潘老师配置的flyway
,这次自己亲自配置,还是遇到了许多问题的。
尝试的过程中,也尝试了一些错误的方向,最终总结出本文,希望对你有所帮助。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。