flyway简单使用

flyway简单使用flyway简单使用官网看这里https://flywaydb.org/背景Flyway是独立于数据库的应用、管理并跟踪数据库变更的数据库版本管理工具。用通俗的话讲,Flyway可以像Git管理不同人的代码那样,管理不同人的sql脚本,从而做到数据库同步。流程1、首先配置好flyway的基本信息后,运行项目,会在数据库表中默认新建一个数据表用于存储flyway的运行信息,默认的数据库名:flyway_schema_history2、紧接着Flyway将开始扫描文件系统或应用程序的类路径进行迁

大家好,欢迎来到IT知识分享网。

flyway简单使用

官网看这里https://flywaydb.org/

背景

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

(0)

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

关注微信