flyway java使用_浅谈SpringBoot之开启数据库迁移的FlyWay使用
发布日期:2021-06-25 03:25:50 浏览次数:8 分类:技术文章

本文共 2794 字,大约阅读时间需要 9 分钟。

本文介绍了SpringBoot开启数据库迁移的FlyWay使用,分享给大家,具体如下:

一,首先我先了解下FlyWay是如何运转的。

最简单的方案是将Flyway指向一个空数据库。

3ec7a65e92fca0dfbec2836873d6ae9e.png

它将尝试找到其元数据表。当数据库为空时,Flyway将不会找到它, 而是创建它。您现在拥有一个名为SCHEMA_VERSION的单个空表的数据库 :

6a71a2fc0e826563102aaba303f3050a.png

该表将用于跟踪数据库的状态。之后,Flyway将开始扫描应用程序的文件系统或类路径进行迁移。它们可以用Sql或Java编写。

然后根据其版本号对迁移进行排序,并按顺序应用:

59b62031332a6d0cc1ba58f029027e83.png

随着应用每个迁移,元数据表将相应更新:

schema_version

2b85d190b3a718a1485fe7cdc213787d.png

随着元数据和初始状态的到位,我们现在可以谈论迁移到较新的版本。

Flyway将再次扫描应用程序的文件系统或类路径进行迁移。根据元数据表检查迁移。如果版本号低于或等于标记为当前版本的版本号,则忽略它们。

剩余的迁移是挂起的迁移:可用但未应用。

35334bc81c2f7d519727c24a261f9ef9.png

然后,他们通过版本号进行排序,并依次执行:

fcda6fffeaad3982071b5cb34e969108.png

该元数据表进行更新,因此:

schema_version

就是这样!每当需要发展数据库时,无论是结构(DDL)还是参考数据(DML),只需创建一个版本号高于当前版本的新迁移。下一次Flyway启动时,它会发现并相应地升级数据库。

二,FlyWay在SpingBoot的使用

一种途径是通过Spring Boot的spring.jpa.hibernate.ddl-auto属性将hibernate.hbm2ddl.auto属性设置为create、 create-drop或update。例如,要把hibernate.hbm2ddl.auto设置为create-drop,我们可以在application.yml里加入如下内容:

spring:

jpa:

hibernate:

ddl-auto: create-drop

然而,这对生产环境来说并不理想,因为应用程序每次重启数据库, Schema就会被清空,从头开始重建。它可以设置为update,但就算这样,我们也不建议将其用于生产环境。

还有一个途径。我们可以在schema.sql里定义Schema。在第一次运行时,这么做没有问题,但随后每次启动应用程序时,这个初始化脚本都会失败,因为数据表已经存在了。这就要求在书写初始化脚本时格外注意,不要重复执行那些已经做过的工作。

一个比较好的选择是使用数据库迁移库(database migration library)。它使用一系列数据库脚本,而且会记录哪些已经用过了,不会多次运用同一个脚本。应用程序的每个部署包里都包含了这些脚本,数据库可以和应用程序保持一致。Spring Boot为两款流行的数据库迁移库提供了自动配置支持。

当你想要在Spring Boot里使用其中某一个库时,只需在项目里加入对应的依赖,然后编写脚本就可以了。让我们先从Flyway开始了解吧。

1. 用Flyway定义数据库迁移过程

Flyway是一个非常简单的开源数据库迁移库,使用SQL来定义迁移脚本。它的理念是,每个脚本都有一个版本号, Flyway会顺序执行这些脚本,让数据库达到期望的状态。它也会记录已执行的脚本状态,不会重复执行。在阅读列表应用程序这里,我们先从一个没有数据表和数据的空数据库开始。因此,这个脚 本里需要先创建Reader和Book表,包含外键约束和初始化数据。代码清单8-2就是从空数据库到 可用状态的Flyway脚本。

Flyway数据库初始脚本

create table Reader (

id serial primary key,

username varchar(25) unique not null,

password varchar(25) not null,

fullname varchar(50) not null

);

create table Book (

id serial primary key,

author varchar(50) not null,

description varchar(1000) not null,

isbn varchar(10) not null,

title varchar(250) not null,

reader_username varchar(25) not null,

foreign key (reader_username) references Reader(username)

);

create sequence hibernate_sequence;

insert into Reader (username, password, fullname)

values ('craig', 'password', 'Craig Walls');

如你所见, Flyway脚本就是SQL。让其发挥作用的是其在Classpath里的位置和文件名。Flyway脚本都遵循一个命名规范,含有版本号,具体如图8-1所示。

a37d7515e9bdac9ab96425410756b546.png

所有Flyway脚本的名字都以大写字母V开头,随后是脚本的版本号。后面跟着两个下划线和对脚本的描述。因为这是整个迁移过程中的第一个脚本,所以它的版本是1。描述可以很灵活,主要用来帮助理解脚本的用途。稍后我们需要向数据库添加新表,或者向已有数据表添加新字段。可以再创建一个脚本,标明版本号为2。Flyway脚本需要放在相对于应用程序Classpath根路径的/db/migration路径下。因此,项目中, 脚本需要放在src/main/resources/db/migration里。你还需要将spring.jpa.hibernate.ddl-auto设置为none,由此告知Hibernate不要创建数据表。这关系到application.yml中的如下内容:

spring:

jpa:

hibernate:

ddl-auto: none

剩下的就是将Flyway添加为项目依赖。在Gradle里,此依赖是这样的:

compile(“org.flywaydb:flyway-core”)

在Maven项目里, 是这样的:

org.flywayfb

flyway-core

在应用程序部署并运行起来后, Spring Boot会检测到Classpath里的Flyway,自动配置所需的 Bean。 Flyway会依次查看/db/migration里的脚本,如果没有执行过就运行这些脚本。每个脚本都执行过后,向schema_version表里写一条记录。应用程序下次启动时,Flyway会先看schema_version里的记录,跳过那些脚本。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

转载地址:https://blog.csdn.net/weixin_35901163/article/details/114667792 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:java集合类练习_Java集合和日期类练习
下一篇:jsp中输出java中的属性_jsp:__________动作取得JavaBeans属性的值,并将其转换成字符串值,最后插入到输出结果中。...

发表评论

最新留言

关注你微信了!
[***.104.42.241]2024年03月15日 18时35分40秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章