大家好,欢迎来到IT知识分享网。
flyway简单使用
背景
Flyway是独立于数据库的应用、管理并跟踪数据库变更的数据库版本管理工具。用通俗的话讲,Flyway可以像Git管理不同人的代码那样,管理不同人的sql脚本,从而做到数据库同步。
流程
1、 首先配置好flyway的基本信息后,运行项目,会在数据库表中默认新建一个数据表用于存储flyway的运行信息,默认的数据库名:flyway_schema_history
2、 紧接着Flyway将开始扫描文件系统或应用程序的类路径进行迁移。然后,Flyway的数据迁移将基于对用sql脚本的版本号进行排序,并按顺序应用:
可以看到执行数据库表后在checksum中储存一个数值,用于在之后运行过程中对比sql文件执行是否有变化。
注意:
flyway在执行脚本时,会在源数据表中检查checksum值,并确定上次运行到哪一个脚本文件,本次执行时从下一条脚本文件开始执行。所以编写脚本的时候不要去修改原有的脚本内容,并且新的脚本版本号要连续
java集成
1.添加依赖
plugins {
id 'java'
id 'org.springframework.boot' version '2.5.2'
id 'io.spring.dependency-management' version '1.0.11.RELEASE'
}
group 'org.example'
version '1.0-SNAPSHOT'
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter'
implementation 'org.flywaydb:flyway-core'
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'junit:junit:4.13.1'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
compile group: 'mysql', name: 'mysql-connector-java', version: '5.1.46'
compile group: 'org.springframework.boot', name: 'spring-boot-starter-jdbc'
compile('com.alibaba:fastjson:1.2.47')
}
test {
useJUnitPlatform()
}
2.命名规范
sql 脚本存放目录:src/main/resources/db/migration
对应一个程序版本的多个脚本,从1开始,比如1.0.9版本,有多个任务:张三负责a任务(tapd号为1111111),李四负责b任务(tapd号为222222),他们的任务都涉及到db更新他们会分别创建两个脚本:
V1.0.9.0.1__1111111.sql
V1.0.9.0.2__222222.sql
说明:V大写,中间是两个下划线(__)
常见问题
1、可以基于环境变量,实现不同的环境,做不同的初始化脚本吗?
基于我们的配置中 心,可以对flyway.locations配置进行修改,不同环境的初始化脚本可以放到不同的目录下。
2、初始化数据过程会发生错误回滚?
每 一个sql 文件会有 一个单独的事物,如果单个文件中发 生错误,单个文件的操作会回滚, 比如有1、2、3个 文件,第 二个文件发生错误,第二个文件所有操作将会回滚,第三个文件不会执行。但: Unfortunately, today only DB2, PostgreSQL, Derby, EnterpriseDB and to a certain extent SQL Server support DDL statements inside a transaction。 所以,建议不要把ddl 文件和dml语句句放到同 一个文件 里,避免不必要的麻烦。
3、多个节点能够并行执行migration吗?
当然可以!Flyway使用数据库锁机制(locking technology of your database)来协调多个节点,从而保证多套应用程序可同时执行migration,而且集群控制也可做配置。
项目示例
本示例使用springboot,依赖使用gradle管理
controller
package com.example.flyway.controller;
import com.example.flyway.entity.User;
import com.example.flyway.service.IUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private IUserService userService;
@RequestMapping(value = "/create", method = RequestMethod.POST)
@ResponseStatus(HttpStatus.CREATED)
public User create (@RequestBody User user) throws Exception {
int i = userService.create(user);
if (i == 1) {
return user;
} else {
throw new Exception("Create Failed!");
}
}
@RequestMapping(value = "/listAll", method = RequestMethod.GET)
@ResponseBody
public List<User> listAll() {
return this.userService.listAll();
}
}
service
package com.example.flyway.service;
import com.example.flyway.entity.User;
import java.util.List;
public interface IUserService {
List<User> listAll ();
int create (User user);
}
package com.example.flyway.service.impl;
import com.example.flyway.dao.IUserDao;
import com.example.flyway.entity.User;
import com.example.flyway.service.IUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.UUID;
@Service
public class UserServiceImpl implements IUserService {
@Autowired
private IUserDao userDao;
@Override
public int create(User user) {
if (user.getId() == null) {
user.setId(UUID.randomUUID().toString());
}
return this.userDao.create(user);
}
@Override
public List<User> listAll() {
return this.userDao.listAll();
}
}
dao
package com.example.flyway.dao;
import com.example.flyway.entity.User;
import java.util.List;
public interface IUserDao {
List<User> listAll ();
int create(User user);
}
package com.example.flyway.dao.impl;
import com.example.flyway.dao.IUserDao;
import com.example.flyway.entity.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
public class UserDaoImpl implements IUserDao {
@Autowired
private JdbcTemplate jdbcTemplate;
@Override
public List<User> listAll() {
return this.jdbcTemplate.query("select * from t_user", new BeanPropertyRowMapper<>(User.class));
}
@Override
public int create(User user) {
return this.jdbcTemplate.update("insert into t_user (id, name, age) values (?, ?, ?)", user.getId(), user.getName(), user.getAge());
}
}
entity
package com.example.flyway.entity;
import java.io.Serializable;
public class User implements Serializable {
private String id;
private String name;
private int age;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
启动类
package com.example.flyway;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
配置文件
server:
port: 8080
spring:
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/mydatabase?useUnicode=true&characterEncoding=utf8&useSSL=false&allowPublicKeyRetrieval=true
username: root
password: 123456
flyway:
# 是否启用flyway
enabled: true
# 编码格式,默认UTF-8
encoding: UTF-8
# 迁移sql脚本文件存放路径,默认db/migration
locations: classpath:db/migration
# 迁移sql脚本文件名称的前缀,默认V
sql-migration-prefix: V
# 迁移sql脚本文件名称的分隔符,默认2个下划线__
sql-migration-separator: __
# 迁移sql脚本文件名称的后缀
sql-migration-suffixes: .sql
# 迁移时是否进行校验,默认true
validate-on-migrate: true
# 当迁移发现数据库非空且存在没有元数据的表时,自动执行基准迁移,新建schema_version表
baseline-on-migrate: true
脚本
目录 /db/migration
脚本一:V2_0__create_table.sql
create table t_user(
id varchar(128) primary key,
name varchar(256) not null,
age int
) default character set utf8;
脚本二:V3_0__insert.sql
insert into t_user (id, name, age) values ('89490dfc-61d4-48c6-afea-e0d9f25f094f', '陈磊', 10000);
insert into t_user (id, name, age) values ('79490dfc-61d4-48c6-afea-e0d9f25f094f', '陈磊', 10000);
insert into t_user (id, name, age) values ('69490dfc-61d4-48c6-afea-e0d9f25f094f', '陈磊', 10000);
insert into t_user (id, name, age) values ('59490dfc-61d4-48c6-afea-e0d9f25f094f', '陈磊', 10000);
结果
执行项目,我们会在数据库看到flyway_schema_history这张表
在表中,我们会看到执行的版本信息。
简单操作,有什么问题,请多多指教。
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/23370.html