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 07 MySQL
详解Mysql和Oracle之间的误区
May 18 MySQL
MySQL5.7并行复制原理及实现
Jun 03 MySQL
为什么代码规范要求SQL语句不要过多的join
Jun 23 MySQL
MySQL去除重叠时间求时间差和的实现
Aug 23 MySQL
MySQL中的引号和反引号的区别与用法详解
Oct 24 MySQL
SQL注入详解及防范方法
Dec 06 MySQL
教你如何让spark sql写mysql的时候支持update操作
Feb 15 MySQL
MySQL库表太大怎么办? 数据库分库分表项目实践
Apr 11 MySQL
Mysql 8.x 创建用户以及授予权限的操作记录
Apr 18 MySQL
MySQL索引 高效获取数据的数据结构
May 02 MySQL
详解MySQL的内连接和外连接
May 08 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
BBS(php & mysql)完整版(五)
2006/10/09 PHP
使用ThinkPHP+Uploadify实现图片上传功能
2014/06/26 PHP
php面向对象中static静态属性和静态方法的调用
2015/02/08 PHP
教你在PHPStorm中配置Xdebug
2015/07/27 PHP
PHP新建类问题分析及解决思路
2015/11/19 PHP
Jquery操作下拉框(DropDownList)实现取值赋值
2013/08/13 Javascript
javascript基于HTML5 canvas制作画箭头组件
2014/06/25 Javascript
JavaScript编写简单的计算器
2015/11/25 Javascript
jQuery之动画效果大全
2016/11/09 Javascript
form+iframe解决跨域上传文件的方法
2016/11/18 Javascript
JQuery EasyUI的一些常用组件
2017/07/12 jQuery
JavaScrip数组删除特定元素的几种方法总结
2017/09/06 Javascript
深入浅析Vue中的slots/scoped slots
2018/04/03 Javascript
使用JS代码实现俄罗斯方块游戏
2018/08/03 Javascript
JS数组求和的常用方法总结【5种方法】
2019/01/14 Javascript
JavaScript中的相等操作符使用详解
2019/12/21 Javascript
微信小程序全选多选效果实现代码解析
2020/01/21 Javascript
[53:15]2018DOTA2亚洲邀请赛3月29日 小组赛A组 LGD VS TNC
2018/03/30 DOTA
python编程开发之textwrap文本样式处理技巧
2015/11/13 Python
浅析Python 中整型对象存储的位置
2016/05/16 Python
Python多进程multiprocessing用法实例分析
2017/08/18 Python
python实现字符串加密 生成唯一固定长度字符串
2019/03/22 Python
使用虚拟环境打包python为exe 文件的方法
2019/08/29 Python
使用python绘制二维图形示例
2019/11/22 Python
解决json中ensure_ascii=False的问题
2020/04/03 Python
Python定时任务框架APScheduler原理及常用代码
2020/10/05 Python
美国著名的团购网站:Woot
2016/08/02 全球购物
如何选择使用结构还是类
2014/05/30 面试题
个人求职信范文分享
2013/12/13 职场文书
在校大学生的职业生涯规划书
2014/03/14 职场文书
公司股东出资证明书
2014/11/01 职场文书
工作失误检讨书范文
2015/01/26 职场文书
年度考核登记表个人总结
2015/03/06 职场文书
大学学习委员竞选稿
2015/11/20 职场文书
员工试用期工作总结
2019/06/20 职场文书
python实现会员信息管理系统(List)
2022/03/18 Python