mysql 表结构版本管理_数据库表结构怎么进行版本管理?(这个工具你值得拥有!)...

8d223d22dbee297fbca22d66025ee549.png

数据库表结构怎么进行版本管理?(这个工具你值得拥有!)

前言

新功能开发了好久终于通过测试准备上线了,没想到在生产环境一运行直接报错了,一查是这次新功能开发增加了好几张表,然而却没有同步到线上数据库,不得不说这失误也太低级了吧!

为了防止再次发生类似问题,能否通过程序自动帮助我们完成数据库表结构的版本管理呢?

目录

为什么需要对数据库迁移进行版本管理?

Flyway原理浅析

SpringBoot项目集成Flyway

总结

为什么需要对数据库迁移进行版本管理?

一个项目在通常情况下都是多人协作开发,我做这个功能、你做那个功能,因为有非常成熟的版本管理工具如Git和SVN来对代码进行版本管理,所以一般在代码同步上不会出什么问题。

但是我回想了一下,在数据库同步层面经常会发生一些小问题:

57e25327e509302d1142a090766f7f25.png

比如我在做新功能时在本地数据库新建了一张表,功能做完之后我将代码提交到主干分支;另外一个程序员小伙伴同步最新代码之后在本地就会跑不起来,因为他电脑的本地数据库并没有我新建的这张表。怎么办?我手动将建表语句发给他,他再手动执行一遍,这是人少的情况,人多的情况下都不知道该找谁要表结构?

再比如一般我们开发项目会有集成开发、测试和生产3套运行环境,每次发版我们先要把数据库表结构的变动在集成开发环境执行一遍,没问题再转到测试环境,最后上线时再到生产环境。

先不说这种同步数据库的方式累不累人,在开发环境还每个开发可以自己去同步自己改动的部分,可是到了生产环境所有的数据库结构变动都被混合到了一起,那么我们该怎么确定每个变动的先后顺序呢?

通过以上两个场景可以看到要在多人和多环境之间进行数据库表结构的同步是非常麻烦且容易出错的。

Flyway原理浅析

其实市面上支持对数据库迁移进行版本管理的工具还挺多,就Java方面来说有Flyway、Liquibase等开源工具。对比了一下两者的情况,Liquibase功能强大,支持XML、JSON、YAML、SQL4种配置方式,但需要一定的学习成本;Flyway相对则更加小巧简单,基本上可以做到开箱即用。

我认为一般中小型项目使用Flyway完全可以满足需求,大型项目或是企业级的项目使用Liquibase更合适。

这里我们主要介绍一下Flyway这个工具。

Flyway使用一张元数据表flyway_schema_history来记录每次数据库迁移的历史记录。

274b1d764aefb829dbbe90d143cc926c.png

Flyway会随着程序启动,从而开始进行数据库的迁移工作:

如果是首次执行,Flyway会先去扫描指定的文件路径或者是在classpath下寻找迁移文件,迁移文件可以是SQL文件也可以是Java类,这些迁移文件将按照特定的迁移版本号进行排序,然后将依次被执行。

585ca03dbb2f2fd5d6a533ef0593f0b3.png

如果是非首次执行,程序会首先检查迁移的历史记录,如果迁移文件的版本号小于当前数据库的版本号,那么这些迁移文件将不会被执行,所以每次我们新建迁移文件时版本号都必须大于数据库当前版本号。

在Flyway中,迁移文件会被分成3种类型:版本迁移、撤销迁移和可重复迁移。

1、版本迁移

其实大部分的迁移都属于版本迁移,每个版本迁移都应有一个唯一的版本号、一段对本次迁移所改动的描述和一个用于校验文件完整性的摘要值,所有的版本迁移都会且仅会被按序执行一次。

2、撤销迁移

撤销迁移的作用与版本迁移正好相反,主要作用是将与之前相同版本的版本迁移所产生的迁移效果撤销。

比如说V1版本迁移创建了一张test表,那么撤销迁移U1所做的就是drop掉test表。

特别注意的是:对于撤销迁移一定要慎重,因为通常撤销迁移包含drop、delete、truncate等具有破坏性的操作,所以做撤销迁移之前最好能够备份一下数据。

3、可重复迁移

从名字就可以看出可重复迁移可以被多次执行,事实上它没有版本号的概念,只要迁移文件发生变化,迁移就会被重新执行。可重复迁移通常在版本迁移和撤销迁移执行之后才会被执行。

确保可重复迁移里的所有操作重复执行不会出现意外情况。

说完了类型,再来聊聊版本号,迁移文件的版本号怎么定义的呢?答案是通过文件名。

96c1509ad1aec1f1581c8e7e6691a41a.png

一份标准的迁移文件名通常按照以下规则组成:

前缀——V代表版本迁移,U代表撤销迁移,R代表可重复迁移。

版本号——版本号通常点号/下划线和整数组成。

分隔符——固定由两个下划线__组成。

描述——由下划线分隔的单词组成,用于描述本次迁移的目的。

后缀——如果是SQL文件那么固定由.sql组成,如果是基于Java类则默认不需要后缀。

SpringBoot项目集成Flyway

Flyway和Spring Boot一样推崇约定大于配置,所以只需要简单几步就可以使用上Flyway了。

以基于SQL文件的方式迁移为例:

1、在pom.xml文件中引入依赖:

cc71aa70097536afd6bd469a37d11469.png

2、在项目resources目录下新建db/migration目录,用来存放SQL文件,如果想存放到其他目录,可以进行自定义配置,后面会讲到。

a025c6a91655d0525a3adc283193f806.png

3、在配置文件application.properties中配置Flyway元素数据表所在的数据库信息。

a8061eb2c427e21ead645e1118d655d6.png

当然了,其实Flyway还提供了其他非常多的配置项,我们可以按需进行配置。

总结

在多人开发以及多环境下迁移数据库是一件非常麻烦且容易出错的事情,所以我们应该通过程序来自动完成数据库的迁移工作。

Flyway是一款Java开源的数据库迁移管理工具,具备轻便小巧的特点,我们可以无门槛快速集成到项目中。

提供服务:提供线上项目诊断优化、营销运营服务,包含(吸粉,成交,社群,裂变等)服务费用1年:120万 微信:15101117

版权声明:本文内容由互联网用户自发贡献,该文观点及内容相关仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容请联系QQ:15101117立即清除!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 Java 中访问 MySQL 数据库中的结构信息,可以通过以下步骤实现: 1. 加载 MySQL 驱动程序 在使用 Java 访问 MySQL 数据库之前,需要先加载 MySQL 驱动程序。可以使用 Class.forName() 方法加载 MySQL 驱动程序,示例代码如下: ``` Class.forName("com.mysql.jdbc.Driver"); ``` 2. 获取数据库连接 在加载 MySQL 驱动程序之后,需要获取数据库连接。可以使用 DriverManager.getConnection() 方法获取 MySQL 数据库连接,示例代码如下: ``` Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "password"); ``` 其中,jdbc:mysql://localhost:3306/test 是连接 MySQL 数据库的 URL,root 是用户名,password 是密码。 3. 获取数据库元数据 获取数据库连接之后,可以通过 Connection.getMetaData() 方法获取数据库元数据。数据库元数据包含了数据库中所有的信息,示例代码如下: ``` DatabaseMetaData metaData = conn.getMetaData(); ``` 4. 获取结构信息 通过 DatabaseMetaData 对象,可以获取数据库中所有的信息。示例代码如下: ``` ResultSet rs = metaData.getTables(null, null, null, new String[]{"TABLE"}); while (rs.next()) { String tableName = rs.getString("TABLE_NAME"); System.out.println("Table name: " + tableName); ResultSet columns = metaData.getColumns(null, null, tableName, null); while (columns.next()) { String columnName = columns.getString("COLUMN_NAME"); String dataType = columns.getString("TYPE_NAME"); int columnSize = columns.getInt("COLUMN_SIZE"); System.out.println("Column name: " + columnName + ", data type: " + dataType + ", column size: " + columnSize); } } ``` 在上述代码中,首先通过 metaData.getTables() 方法获取所有的 ResultSet 对象,然后遍历 ResultSet 对象,获取每个名。接着,通过 metaData.getColumns() 方法获取每个的列信息,遍历 ResultSet 对象,获取每个列的列名、数据类型和列大小。 以上就是在 Java 中访问 MySQL 数据库中的结构信息的步骤。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值