SpringBoot使用Flyway进行数据库管理的操作方法

一、Flyway简介

Flyway是一款数据库迁移(migration)工具。简单点说,就是在你部署应用的时候,帮你执行数据库脚本的工具。Flyway支持SQL和Java两种类型的脚本,你可以将脚本打包到应用程序中,在应用程序启动时,由Flyway来管理这些脚本的执行,这些脚本被Flyway称之为migration。

就目前而言,我们部署应用的流程大概是这样的:

开发人员将应用程序打包、按顺序汇总并整理数据库升级脚本

DBA拿到数据库升级脚本检查、备份、执行,以完成数据库升级

应部署人员拿到应用部署包,备份、替换,以完成应用程序升级

引入Flyway之后的应用部署流程大概是这样的:

开发人员将应用程序打包

应部署人员拿到应用部署包,备份、替换,以完成应用程序升(Flyway将自动执行升级/备份脚本)。

二、SpringBoot集成使用

1.pom.xml引入依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.0.3.RELEASE</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>
	<groupId>com.example</groupId>
	<artifactId>demo</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>demo</name>
	<description>Demo project for Spring Boot</description>
	<properties>
		<java.version>1.8</java.version>
	</properties>
	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter</artifactId>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>

		<!-- mysql 依赖 -->
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
		</dependency>

		<!-- 数据库版本管理 依赖 -->
		<dependency>
			<groupId>org.flywaydb</groupId>
			<artifactId>flyway-core</artifactId>
		</dependency>

		<!-- 数据库访问依赖 -->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-jdbc</artifactId>
		</dependency>

		<!-- 自动生成get,set方法 依赖 -->
		<dependency>
			<groupId>org.projectlombok</groupId>
			<artifactId>lombok</artifactId>
		</dependency>

	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>

</project>

2.application.properties

# 端口
server.port=8082

# 数据源
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/test1?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true&serverTimezone=PRC&useSSL=false
spring.datasource.username=root
spring.datasource.password=root

# flyway    注:可以完全不用配置
## sql 脚本的位置,默认为 classpath:db/migration。可手动指定
spring.flyway.locations=classpath:db
##  指定数据源,如果没有指定的话,将使用配置的主数据源
spring.flyway.url=jdbc:mysql://127.0.0.1:3306/test1?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true&serverTimezone=PRC&useSSL=false
## Flyway 管理的 Schema 列表,区分大小写。默认连接对应的默认 Schema
## 如果这里明确指定了库名,那么在 spring.flyway.url 连接中指定的库名将无效
spring.flyway.schemas=test1
## 用户名
spring.flyway.user=root
## 密码
spring.flyway.password=root
## 开启,默认开启
spring.flyway.enabled=true

3.resources创建db数据库脚本文件夹

V0.1.0__init_table.sql

-- 创建表
create table t_startAlarm
(
    id      int(100) primary key not null auto_increment,
    name     varchar(100),
    type      varchar(100)
)

V0.1.1__init_table.sql

-- 初始化数据
INSERT INTO t_startAlarm ( id , name , type ) VALUES
('1','电饭煲','用来蒸饭')

V0.1.2__init_table.sql

-- 初始化数据
INSERT INTO t_startAlarm ( id , name , type ) VALUES
('2','电饭煲2','用来蒸饭2')

4.启动DemoApplication主启动类

4.1只有V0.1.0__init_table.sql和V0.1.1__init_table.sql。

项目启动,Flyway 会自动创建一个 flyway_schema_history 表,这个表用来记录数据库的更新历史。

有了这条记录,下次再启动项目,V0.1.1__init_table.sql 这个脚本文件就不会执行了,因为系统知道这个脚本已经执行过了,如果你还想让 V0.1.1__init_table.sql 脚本再执行一遍,需要手动删除 flyway_schema_history 表中的对应记录,那么项目启动时,这个脚本就会被执行了。

注意:

我们在定义脚本的时候,除了 V 字开头的脚本之外,还有一种 R 字开头的脚本,V 字开头的脚本只会执行一次,而 R字开头的脚本,只要脚本内容发生了变化,启动时候就会执行。

使用了 Flyway之后,如果再想进行数据库版本升级,就不用该以前的数据库脚本了,直接创建新的数据库脚本,项目在启动时检测了有新的更高版本的脚本,就会自动执行,这样,在和其他同事配合工作时,也会方便很多。因为正常我们都是从Git 上拉代码下来,不拉数据库脚本,这样要是有人更新了数据库,其他同事不一定能够收到最新的通知,使用了 Flyway就可以有效避免这个问题了。

所有的脚本,一旦执行了,就会在 flyway_schema_history表中有记录,如果你不小心搞错了,可以手动从 flyway_schema_history 表中删除记录,然后修改 SQL脚本后再重新启动(生产环境不建议)。

测试数据库中结果:

2D2F0650-6CED-0BA5-E5E6-3DB9AE636C91.jpeg

31246D5F-7597-FCBD-7A5E-61463DB11622.jpeg

添加V0.1.2__init_table.sql,测试数据库中结果

A858D9E5-7A29-E716-5935-64151540C9DC.jpeg

B7424059-9A7D-3462-40A0-310E3CB0B22D.jpeg

三、项目整体结构

代码地址链接: SpringbootFlyway

DD8257E6-7807-BD16-646A-2708C378959B.png

参考文章

https://www.cnblogs.com/wangzh1guo/articles/13834706.html

收藏 (0)
评论列表
正在载入评论列表...
我是有底线的
为您推荐
    暂时没有数据