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 重命名表的操作方法及注意事项
May 21 MySQL
MySQL 外键约束和表关系相关总结
Jun 20 MySQL
分析mysql中一条SQL查询语句是如何执行的
Jun 21 MySQL
MySQL快速插入一亿测试数据
Jun 23 MySQL
MySQL里面的子查询的基本使用
Aug 02 MySQL
SQL优化老出错,那是你没弄明白MySQL解释计划用法
Nov 27 MySQL
MySQL如何快速创建800w条测试数据表
Mar 17 MySQL
MySQL创建管理LIST分区
Apr 13 MySQL
MySQL数据库 安全管理
May 06 MySQL
MySQL聚簇索引和非聚簇索引的区别详情
Jun 14 MySQL
mysql sql常用语句大全
Jun 21 MySQL
数据设计之权限的实现
Aug 05 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
PHP4实际应用经验篇(1)
2006/10/09 PHP
如何跨站抓取别的站点的页面的补充
2006/10/09 PHP
在任意字符集下正常显示网页的方法一
2007/04/01 PHP
php截取字符串并保留完整xml标签的函数代码
2013/02/06 PHP
析构函数与php的垃圾回收机制详解
2013/10/28 PHP
php实现文件下载代码分享
2014/08/19 PHP
ThinkPHP5.0框架结合Swoole开发实现WebSocket在线聊天案例详解
2019/04/02 PHP
PHP代码加密的方法总结
2020/03/13 PHP
js中return false(阻止)的用法
2013/08/14 Javascript
jQuery实现的Div窗口震动特效
2014/06/09 Javascript
javascript使用正则控制input输入框允许输入的值方法大全
2014/06/19 Javascript
JavaScript操作DOM元素的childNodes和children区别
2015/04/01 Javascript
javascript中传统事件与现代事件
2015/06/23 Javascript
JavaScript数组合并的多种方法
2016/05/22 Javascript
AngularJS ng-bind 指令简单实现
2016/07/30 Javascript
javascript的几种写法总结
2016/09/30 Javascript
jQuery插件FusionCharts实现的3D帕累托图效果示例【附demo源码】
2017/03/25 jQuery
基于VUE选择上传图片并页面显示(图片可删除)
2017/05/25 Javascript
微信小程序授权获取用户详细信息openid的实例详解
2017/09/20 Javascript
vue2.0 可折叠列表 v-for循环展示的实例
2018/09/07 Javascript
Python 冒泡,选择,插入排序使用实例
2015/02/05 Python
python使用线程封装的一个简单定时器类实例
2015/05/16 Python
python 获取文件下所有文件或目录os.walk()的实例
2018/04/23 Python
TensorFlow实现随机训练和批量训练的方法
2018/04/28 Python
Python爬虫信息输入及页面的切换方法
2018/05/11 Python
python+PyQT实现系统桌面时钟
2020/06/16 Python
Pytorch反向求导更新网络参数的方法
2019/08/17 Python
python+excel接口自动化获取token并作为请求参数进行传参操作
2020/11/10 Python
Pytorch模型迁移和迁移学习,导入部分模型参数的操作
2021/03/03 Python
CSS3实现银灰色动画效果的导航菜单代码
2015/09/01 HTML / CSS
英国领先的隐形眼镜在线供应商:Lenstore.co.uk
2019/11/24 全球购物
水务局局长岗位职责
2013/11/28 职场文书
2014年会计主管工作总结
2014/12/20 职场文书
教师节老师寄语
2015/05/28 职场文书
大学生支教感言
2015/08/01 职场文书
Java基于Dijkstra算法实现校园导游程序
2022/03/17 Java/Android