软件开发正常流程是:开发环境 ---> 测试环境  ----> 产环境

在开发过程中经常需要变更数据库:

  1. 表结构变更。
  2. 基础数据变更。

最直接的做法是:用客户端连上数据库直接修改。 依次修改开发、测试、正式环境。

这样做的风险是:

  1. 容易漏改,经常会造成开发、测试、生产环境数据结构不一致导致程序异常,排查错误浪费了大量时间。
  2. 没有记录下修改过程,数据结构出现问题很难复盘出历史修改过程。
  3. 完全靠人工约束,给项目管理增加额外难度。

改进方案:

所有数据库修改都需要通过sql 语句修改,sql语句同源代码一样纳入版本控制系统(如git),采用工具(flyway等)自动在不同环境执行sql语句,流程如下:

  1. 开发:将本次数据库改动写成sql语句放到文件中,在开发环境执行flyway让数据库改动生效。
  2. 测试:项目上线到测试环境前,先执行flyway 。
  3. .上线:在正式环境执行flyway.

如何使用

项目介绍:

官网: https://flywaydb.org/getstarted/firststeps/maven

源码:https://github.com/flyway/flyway

该项目是非常活跃的项目,如下图:

运行方式:

flyway 支持多种用运行方式:

插件模式:

可以作为ant maven gradle 的插件运行 ,这种模式不用写代码,只需要配置就OK了。

编码模式:

flyway 提供了接口,可以在通过编写代码来运行。

运行:

按照文档https://flywaydb.org/getstarted/firststeps/maven  一步一步操作:

  1. 新建一个maven 项目:

  1. 导入到IDEA 后如下图:

注意问题:

  1. 文件命名规则: 必须以 V数字__ 开头,否者无法通过。
  2. 文件命名规则: V1__xx  V2__xxx  数字必须连续性,否则,无法运行。

一旦执行入库,则文件不能再修改,每次执行之前会进行文件md5校验。

删除文件对应的数据库记录后方可再次执行(不建议这么做,这么做会引起版本的混乱)。

源码解读:

1.用git命令将该项目clone下来:

2.将项目导入到你熟悉的IDE 中(如intellij 或者 Eclipse),这是一个maven 项目,需要按照maven项目导入,导入需要下载很多jar包,比较耗时。导入后如下图:

优缺点:

优点:

1.原理简单,使用方便。

缺点:

  1. 没有引入并发控制,如果在两台机器上并行执行该命令,则并发情况下可能执行两边,如果是 update  t1=t1+1  where id=1 ,那么会导致结果错误。

类似项目:

http://www.liquibase.org/

这个工具提供比flyway 更强大的功能,flyway几乎是liquibase 的一个子集。

工具并不是越强大越好,正确的做法是根据需求灵活选择。

Java开发、互联网架构讨论QQ群: 297702426

邮箱:zfj321@qq.com  需要源码可以联系我,或者加入以上QQ群

数据库版本管理工具--Flyway的使用的更多相关文章

  1. [jOOQ中文]3. 数据库版本管理工具Flyway

    https://segmentfault.com/a/1190000010526452 在执行数据库迁移时,我们推荐使用jOOQ与Flyway - 数据库迁移轻松. 在本章中,我们将简单的来使用这两个 ...

  2. 数据库版本管理工具Flyway(4.0.3)---介绍(译文)

    Flyway Evolve your Database Schema easily and reliably across all your instances 简单的.可靠的升级(发展)你的数据库模 ...

  3. 数据库版本管理工具Flyway——基础篇

    Flyway 默认规约 SQL 脚本文件默认位置是项目的源文件夹下的db/migration 目录. Java 代码默认位于db.migration 包. SQL 脚本文件及Java 代码类名必须遵循 ...

  4. 数据库版本管理工具Flyway(4.0.3)---工作机制(译文)

    How Flyway works The easiest scenario is when you point Flyway to an empty database. 最容易的方案是Flyway指向 ...

  5. 数据库版本管理工具flyway

    引入flyway_core  jar包 java 代码实现 public class FlywayMigration { @Resource private DataSource dataSource ...

  6. 【flyway】开源的数据库版本管理工具【migration】

    开源的数据库版本管理工具[migration] 记录

  7. 在SpringBoot中使用flyway进行数据库版本管理

    本文大纲 flyway是什么 能帮助我们解决什么问题 springboot环境下使用flyway flyway的工作原理 一.flyway是什么 Flyway是一个开源的数据库版本管理工具,并且极力主 ...

  8. Java敏捷数据库迁移框架——Flyway

    1.引言 想到要管理数据库的版本,是在实际产品中遇到问题后想到的一种解决方案,当时各个环境的数据库乱作一团,没有任何一个人(开发.测试.维护人员)能够讲清楚当前环境下的数据库是哪个版本,与哪个版本的应 ...

  9. 使用alembic进行数据库版本管理

    前言 随着项目业务需求的不断变更,数据库的表结构修改难以避免,此时就需要对数据库的修改加以记录和控制,便于项目的版本管理和随意的升级和降级. Alembic就可以很好的解决这个问题.Alembic是S ...

随机推荐

  1. opengles reference card

    https://www.khronos.org/files/opengles31-quick-reference-card.pdf https://www.khronos.org/opengles/s ...

  2. Jquery开发&BootStrap 实现“todolist项目”

    作业题目:实现“todolist项目” 作业需求: 基础需求:85%参考链接http://www.todolist.cn/1. 将用户输入添加至待办项2. 可以对todolist进行分类(待办项和已完 ...

  3. Java多线程断点下载文件

    Java实现断点续传+多线程下载 如下代码所示,每一步都有注解 思路: 通过URL连接到服务器上要下载的文件,得到文件的大小: 算出每条线程下载的开始位置和结束位置,例如,有两条线程下载100Byte ...

  4. ubunut:子进程 post-installation script 返回了错误号 1

    解决dpkg/apt-get error : 子进程 post-installation script 返回了错误号 1 这个不太好解决,感觉这个比较好,未测试 https://blog.csdn.n ...

  5. Python基础--01小项目体现的基础知识

    part1:猜拳游戏 #coding=utf-8 #当有汉语时可能编译器不认识,需要定义代码 ''' 多行注释 写这个程序是为了熟悉python的基本语法 这是第一个小例子包含简单的if判断,循环和输 ...

  6. (十七)线程,connect的第五个参数

    采用多线程,将需要处理的后台数据放入子线程,为了能够跨线程调用,一种方法是使用类似线程锁对线程进行保护,另外一种方法使用Qt的信号槽机制.Qt的信号槽机制采用connect函数进行连接,connect ...

  7. Java进阶知识14 Struts2中的S标签

    1.A 开头 <s:a href=""></s:a> //超链接,类似于html里的<a></a> <s:action nam ...

  8. BERT中文 添加 early_stop

    Step1:建一个hook early_stopping_hook = tf.contrib.estimator.stop_if_no_decrease_hook( estimator=estimat ...

  9. 0079 Ehcache 3.x应用入门及通过JCache与Spring整合

    基本要素:版本.概念与抽象 Ehcache 3.x是一个用Java语言实现的缓存库,并且实现了 JSR107规范 Ehcache从2.x升级到3.x后,Maven依赖从 net.sf.ehcache: ...

  10. 2016"百度之星" - 初赛(Astar Round2A)1006 Gym Class(HDU5695)——贪心+拓扑排序

    分析:首先,利用贪心可知,如果要所有人的分数和最高,需要把序号大的优先放在前面.其次,对于a的前面不能为b,那么只能a在b前面了,那么就建立一条从a到b的边,并且b的入度加1.然后就是拓扑排序了.要分 ...