在代码上我们有svn和git等诸多的版本控制方法。

但是在数据库上却没有相应的工具。一度导致多环境见的数据库同步难以维持。

flyway和liquibase都是常见的数据库版本控制工具。

flyway社区版的功能相对完全免费的liquibase来说简直毫无可比性。

因此免费用户的话强烈liquibase。

样例代码已上传至Github:https://github.com/hackyoMa/changedb,样例基于Spring Boot。

flyway:

application.yml

  1. spring:
  2. datasource:
  3. platform: mysql
  4. url: jdbc:mysql://xxx:3306/xxx?useUnicode=true&characterEncoding=utf8&useSSL=false
  5. username: xxx
  6. password: xxx
  7. driver-class-name: com.mysql.jdbc.Driver
  8. jpa:
  9. database: MYSQL
  10. show-sql: true
  11. hibernate:
  12. ddl-auto: none
  13. flyway:
  14. locations: classpath:db/migration

resources\db\migration\目录下文件:

V1_0__createBook.sql

  1. CREATE TABLE `book` (
  2. `id` int(11) NOT NULL AUTO_INCREMENT,
  3. `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
  4. `create_time` datetime(0) NOT NULL,
  5. PRIMARY KEY (`id`) USING BTREE
  6. ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic;
  7. CREATE TABLE `test` (
  8. `id` int(11) NOT NULL AUTO_INCREMENT,
  9. `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
  10. PRIMARY KEY (`id`) USING BTREE
  11. ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic;
  12. CREATE TRIGGER book_trigger AFTER INSERT ON book FOR EACH ROW BEGIN
  13. INSERT INTO test (`name`) VALUES ('');
  14. END;

V1_1__insertBook.sql

  1. INSERT INTO book(name, create_time) VALUES ('测试', '2018-04-21 16:53:48');

liquibase:

application.yml

  1. spring:
  2. datasource:
  3. platform: mysql
  4. url: jdbc:mysql://xxx:3306/xxx?useUnicode=true&characterEncoding=utf8&useSSL=false
  5. username: xxx
  6. password: xxx
  7. driver-class-name: com.mysql.jdbc.Driver
  8. jpa:
  9. database: MYSQL
  10. show-sql: true
  11. hibernate:
  12. ddl-auto: none
  13. liquibase:
  14. change-log: classpath:db/changelog/db.changelog-master.xml

resources\db\changelog\目录下文件:

db.changelog-1.0.sql

  1. --liquibase formatted sql
  2. --changeset mahaoyu:1.0
  3. CREATE TABLE `book` (
  4. `id` int(11) NOT NULL AUTO_INCREMENT,
  5. `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
  6. `create_time` datetime(0) NOT NULL,
  7. PRIMARY KEY (`id`) USING BTREE
  8. ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic;
  9. --changeset mahaoyu:1.1
  10. CREATE TABLE `test` (
  11. `id` int(11) NOT NULL AUTO_INCREMENT,
  12. `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
  13. PRIMARY KEY (`id`) USING BTREE
  14. ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic;

db.changelog-1.1.sql

  1. --liquibase formatted sql
  2. --changeset mahaoyu:1.2 splitStatements:false
  3. CREATE TRIGGER book_trigger AFTER INSERT ON book FOR EACH ROW BEGIN
  4. INSERT INTO test (`name`) VALUES ('1');
  5. END;
  6. --changeset mahaoyu:1.3 splitStatements:false
  7. CREATE PROCEDURE `proc_adder` ( IN a INT, IN b INT, OUT sum INT ) BEGIN
  8. DECLARE
  9. c INT;
  10. IF
  11. a IS NULL THEN
  12. SET a = 0;
  13. END IF;
  14. IF
  15. b IS NULL THEN
  16. SET b = 0;
  17. END IF;
  18. SET sum = a + b;
  19. END;
  20. --changeset mahaoyu:1.4
  21. CREATE VIEW Oceania AS SELECT * FROM book;
  22. --changeset mahaoyu:1.5 splitStatements:false
  23. CREATE FUNCTION hello ( ) RETURNS VARCHAR ( 255 ) BEGIN
  24. RETURN 'Hello world,i am mysql';
  25. END;
  26. --changeset zhangsan:1.6
  27. INSERT INTO book(name, create_time) VALUES ('测试', '2018-04-21 16:53:48');

db.changelog-master.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <databaseChangeLog
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
  5. xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog
  6. http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.1.xsd">
  7.  
  8. <include file="db/changelog/db.changelog-1.0.sql"/>
  9. <include file="db/changelog/db.changelog-1.1.sql"/>
  10.  
  11. </databaseChangeLog>

这里对liquibase的事务、触发器等进行了示例。另外liquibase还支持xml语法,以增加对不同数据库的支持。

flyway和liquibase的使用样例的更多相关文章

  1. Flyway对比Liquibase(转)

    数据库迁移工具. 很多应用的运行是需要数据库支持的,而随着快速迭代,产品更替的节奏加快,除了产品本身需要不断更新以外,数据库也需要做出合适的管理了. 为什么需要数据库迁移管理 比如第一个版本的产品只包 ...

  2. C++的性能C#的产能?! - .Net Native 系列《三》:.NET Native部署测试方案及样例

    之前一文<c++的性能, c#的产能?!鱼和熊掌可以兼得,.NET NATIVE初窥> 获得很多朋友支持和鼓励,也更让我坚定做这项技术的推广者,希望能让更多的朋友了解这项技术,于是先从官方 ...

  3. MarkDown+LaTex 数学内容编辑样例收集

    $\color{green}{MarkDown+LaTex 数学内容编辑样例收集}$ 1.大小标题的居中,大小,颜色 [例1] $\color{Blue}{一元二次方程根的分布}$ $\color{R ...

  4. 33个超级有用必须要收藏的PHP代码样例

    作为一个正常的程序员,会好几种语言是十分正常的,相信大部分程序员也都会编写几句PHP程序,如果是WEB程序员,PHP一定是必备的,即使你没用开发过大型软件项目,也一定多少了解它的语法. 在PHP的流行 ...

  5. 关于peersim样例配置文件的超详细解读(新手勿喷)

    相信很多兄弟一开始接触peersim,对配置文件还是有点不适应,我看了好久的样例的配置文件,一层层去找对应的文件的方法,终于好像悟懂了一点,记下来以后回顾. 贴上代码,一点点分析. 首先要说下所谓的配 ...

  6. hdu 1003 MAX SUM 简单的dp,测试样例之间输出空行

    测试样例之间输出空行,if(t>0) cout<<endl; 这样出最后一组测试样例之外,其它么每组测试样例之后都会输出一个空行. dp[i]表示以a[i]结尾的最大值,则:dp[i ...

  7. CloudSim样例分析

    自带八个样例描述: cloudsim-2.1.1\examples目录下提供了一些CloudSim样例程序,每个样例模拟的环境如下: (1)CloudSimExample1.Java:创建一个一台主机 ...

  8. 样例20-汽车SHOW

    观看样例点这里 素材下载 1.设置场景大小为400*3002.执行:文件->导入->导入到库,选择需要的汽车图片文件,将其导入到库面板中3.按照同样的方式,在库面板中导入所需的背景音乐文件 ...

  9. java使用xsd校验xml样例

    知识点:XSD文件是指XML结构定义 ( XML Schemas Definition )文件,是DTD的替代品.可以用一个指定的XML Schema来验证某个XML文档,以检查该XML文档是否符合其 ...

随机推荐

  1. laravel部署创建新项目 助记

    打开进入homestead虚拟机,并进入code文件夹 cd ~/homestead && vagrant up && vagrant ssh cd ~/Code 进行 ...

  2. Arch Linux安装Firefox 火狐中文版

    很多人刚安装好系统之后,刚开始内置的浏览器是火狐的英文版,很多时候因为需要账号同步的原因需要国内版本的火狐浏览器,这个时候我们应该怎么操作呢? 其实也非常的简单 首先我们 输入命令 pacman -S ...

  3. Linux中删除特殊名称文件的多种方式

    今日分享:我们在肉体的疾病方面花了不少钱,精神的病害方面却没有花什么,现在已经到了时候,我们应该有不平凡的学校.--<瓦尔登湖> 前言 我们都知道,在linux删除一个文件可以使用rm命令 ...

  4. 【English】20190320

    valid有效的 [ˈvælɪd]  solitary独立的 [ˈsɑ:ləteri] data definition not valid unless solitary qualifying有资格的 ...

  5. Ajax概述和判断用户名是否存在的简单代码练习

    在本代码中主要体现,Ajax实现了部分位置的刷新.不需要重新刷新网页,重新请求服务器.下面用过代码来对Ajax更深的认识 这里需要创建,一个jsp文件(显示登录界面),js文件(对Ajax的主要设置) ...

  6. java获取类加载路径和项目根路径的5种方法

    // 第一种:获取类加载的根路径 D:\IDEAWorkspace\hs-bluetooth-lock\src\applications\bluetooth-api\target\classes Fi ...

  7. python3 闭包函数

    '''闭包函数:内部函数引用外部函数变量(非全局变量)'''def func(y): x = 1 def func1(): print(x, y) return func1 f = func(2)pr ...

  8. node+mysql 数据库连接池

    1. 什么是数据库连接池? 数据库连接池是程序启动时建立足够的数据库连接,并将这些连接组成一个池,由程序动态地对池中的连接进行申请,使用和释放. 2. 使用数据库连接池原理及优点是什么? 数据库连接池 ...

  9. Python OpenCV 图像处理初级使用

    # -*- coding: utf-8 -*-"""Created on Thu Apr 25 08:11:32 2019 @author: jiangshan" ...

  10. Educational Codeforces Round 62 (Rated for Div. 2) Solution

    最近省队前联考被杭二成七南外什么的吊锤得布星,拿一场Div. 2恢复信心 然后Div.2 Rk3.Div. 1+Div. 2 Rk9,rating大涨200引起舒适 现在的Div. 2都怎么了,最难题 ...