MySql开发之自动同步表结构


Posted in MySQL onMay 28, 2021

开发痛点

在开发过程中,由于频繁的修改数据库的字段,导致rd和qa环境的数据库表经常不一致。

而由于这些修改数据库的操作可能由多个rd操作,很难一次性收集全。人手工去和qa环境对字段又特别繁琐,容易遗漏。

解决之道

于是笔者就写了一个能够自动比较两个数据库的表结构,并生成alter语句的程序。同时还可以进行配置从而自动这行这些alter语句。详情见github

原理

同步新增的表

如果rd环境新增的表,而qa环境没有,此程序可以直接输出create table语句。原理如下:

MySql开发之自动同步表结构

用到的sql主要有:

show table from rd_db;
show create table added_table_name;

同步表结构

如果rd表结构有改动,而qa环境没有,此程序可以直接输出alter语句,原理如下:

MySql开发之自动同步表结构

用到的sql有:

select 
 COLUMN_NAME,COLUMN_TYPE,IS_NULLABLE,COLUMN_DEFAULT,COLUMN_COMMENT,EXTRA 
from 
 information_schema.columns
where 
  TABLE_SCHEMA='rd_db'
  and TABLE_NAME = 'rd_table';

比较表结构的代码:

for (Column column : sourceTable.getColumns().values()) {
            if (targetTable.getColumns().get(column.getName()) == null) {
                // 如果对应的target没有这个字段,直接alter
                String sql = "alter table " + target.getSchema() + "." + targetTable.getTableName() + " add " + column
                        .getName() + " ";
                sql += column.getType() + " ";
                if (column.getIsNull().equals("NO")) {
                    sql += "NOT NULL ";
                } else {
                    sql += "NULL ";
                }
                if (column.getDefaultValue() != null) {
                    sql += "DEFAULT " + SqlUtil.getDbString(column.getDefaultValue()) + " ";
                }
                if (column.getComment() != null) {
                    sql += "COMMENT " + SqlUtil.getDbString(column.getComment()) + " ";
                }
                if (after != null) {
                    sql += "after " + after;
                }
                changeSql.add(sql+";");
            } else {
                // 检查对应的source 和 target的属性
                String sql =
                        "alter table " + target.getSchema() + "." + targetTable.getTableName() + " change " + column
                                .getName() + " ";
                Column sourceColumn = column;
                Column targetColumn = targetTable.getColumns().get(sourceColumn.getName());
                // 比较两者字段,如果返回null,表明一致
                String sqlExtend = compareSingleColumn(sourceColumn, targetColumn);
                if (sqlExtend != null) {
                    changeSql.add(sql + sqlExtend+";");
                }
            }
            after = column.getName();
        }

同步索引结构

如果rd表的索引有改变,而qa环境没有,此程序可以直接输出修改索引语句。原理和上面类似,在此不再赘述。

配置

sourceHost=127.0.0.1:3306
sourceUser=root
sourcePass=123123123
sourceSchema=mystique_db
sourceCharset=utf8

targetHost=127.0.0.1:3306
targetUser=root
targetPass=123123123
targetSchema=mystique_test
targetCharset=utf8

autoExecute=YES //此处表明自动同步

运行

按照上面的模板进行配置 用IDE打开,找到

alchemystar.runner.ShellRunner

运行其中的main方法即可

生成效果展示

alter table mystique_test.t_test_3 change id id bigint(20) NOT NULL AUTO_INCREMENT COMMENT ''
alter table mystique_test.t_test_3 add index (name)
alter table mystique_test.t_test_3 drop index name_id
alter table mystique_test.t_test_3 add id_2 varchar(50) NULL DEFAULT '' COMMENT '' after name

如果打开了自动执行,会自动执行这些语句

github链接

https://github.com/alchemystar/Lancer

码云链接

https://git.oschina.net/alchemystar/Lancer

总结

到此这篇关于MySql开发之自动同步表结构的文章就介绍到这了,更多相关MySql自动同步表结构内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

MySQL 相关文章推荐
MySQL表的增删改查(基础)
Apr 05 MySQL
MySQL官方导出工具mysqlpump的使用
May 21 MySQL
MySQL 如何设计统计数据表
Jun 15 MySQL
低版本Druid连接池+MySQL驱动8.0导致线程阻塞、性能受限
Jul 01 MySQL
Mysql8.0递归查询的简单用法示例
Aug 04 MySQL
MySQL 如何限制一张表的记录数
Sep 14 MySQL
mysql5.7的安装及Navicate长久免费使用的实现过程
Nov 17 MySQL
SQL基础查询和LINQ集成化查询
Jan 18 MySQL
MySQL为数据表建立索引的原则详解
Mar 03 MySQL
提高系统的吞吐量解决数据库重复写入问题
Apr 23 MySQL
MySQL串行化隔离级别(间隙锁实现)
Jun 16 MySQL
mysql升级到5.7时,wordpress导数据报错1067的问题
May 27 #MySQL
解决Navicat for Mysql连接报错1251的问题(连接失败)
Navicat for MySQL的使用教程详解
MySQL Router实现MySQL的读写分离的方法
MySQL通过binlog恢复数据
May 27 #MySQL
MySQL 数据类型选择原则
May 27 #MySQL
详解MySQL中的主键与事务
May 27 #MySQL
You might like
php判断是否连接上网络的方法实例详解
2016/12/14 PHP
PHP chunk_split()函数讲解
2019/02/12 PHP
js 对象是否存在判断
2009/07/15 Javascript
让 JavaScript 轻松支持函数重载 (Part 2 - 实现)
2009/08/04 Javascript
jquery 学习笔记一
2010/04/07 Javascript
javascript:void(0)使用探讨
2013/08/27 Javascript
浅析JQuery UI Dialog的样式设置问题
2013/12/18 Javascript
JavaScript调试技巧之console.log()详解
2014/03/19 Javascript
JQuery标签页效果的两个实例讲解(4)
2015/09/17 Javascript
在AngularJS框架中处理数据建模的方式解析
2016/03/05 Javascript
常用的js验证和数据处理总结
2016/08/02 Javascript
微信小程序 后台https域名绑定和免费的https证书申请详解
2016/11/10 Javascript
NodeJS中的MongoDB快速入门详细教程
2016/11/11 NodeJs
Vue.js系列之项目搭建(1)
2017/01/03 Javascript
JS库之wow.js使用方法
2017/09/14 Javascript
Nodejs实现文件上传的示例代码
2017/09/26 NodeJs
深入理解JavaScript和TypeScript中的class
2018/04/22 Javascript
微信小程序实现类似微信点击语音播放效果
2020/03/30 Javascript
Vue封装的组件全局注册并引用
2019/07/24 Javascript
如何在Vue中使localStorage具有响应式(思想实验)
2020/07/14 Javascript
用python分割TXT文件成4K的TXT文件
2009/05/23 Python
用Python写脚本,实现完全备份和增量备份的示例
2018/04/29 Python
python 找出list中最大或者最小几个数的索引方法
2018/10/30 Python
使用Python操作FTP实现上传和下载的方法
2019/04/01 Python
python绘图模块matplotlib示例详解
2019/07/26 Python
Pytorch .pth权重文件的使用解析
2020/02/14 Python
介绍一下ICMP(Internet Control Message Protocol)Internet控制信息协议
2016/11/26 面试题
总经理岗位职责
2013/11/09 职场文书
幼儿园老师辞职信
2014/01/20 职场文书
幼儿园小班教学反思
2014/02/02 职场文书
2014年个人工作总结报告
2014/11/27 职场文书
2015年行政执法工作总结
2015/05/23 职场文书
维护民族团结心得体会2016
2016/01/15 职场文书
python中pandas.read_csv()函数的深入讲解
2021/03/29 Python
SpringBoot+Vue+JWT的前后端分离登录认证详细步骤
2021/09/25 Java/Android
Python通过loop.run_in_executor执行同步代码 同步变为异步
2022/04/11 Python