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事务的隔离级别与MVCC
Apr 22 MySQL
MySQL表字段时间设置默认值
May 13 MySQL
MySQL中distinct和count(*)的使用方法比较
May 26 MySQL
Mysql 设置boolean类型的操作
Jun 04 MySQL
解决mysql模糊查询索引失效问题的几种方法
Jun 18 MySQL
MySQL的安装与配置详细教程
Jun 26 MySQL
MySQL系列之开篇 MySQL关系型数据库基础概念
Jul 02 MySQL
MySQL系列之十二 备份与恢复
Jul 02 MySQL
SQL实现LeetCode(177.第N高薪水)
Aug 04 MySQL
防止web项目中的SQL注入
Dec 06 MySQL
MySQL为数据表建立索引的原则详解
Mar 03 MySQL
一文解答什么是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
PHP设计模式之简单投诉页面实例
2016/02/24 PHP
PHP生成加减算法方式的验证码实例
2018/03/12 PHP
在laravel框架中使用model层的方法
2019/10/08 PHP
PHP实现抽奖功能实例代码
2020/06/30 PHP
基于prototype的validation.js发布2.3.4新版本,让你彻底脱离表单验证的烦恼
2006/12/06 Javascript
Javascript里使用Dom操作Xml
2007/01/22 Javascript
jquery之Document元素选择器篇
2008/08/14 Javascript
js中判断控件是否存在
2010/08/25 Javascript
用js一次改变多个input的readonly属性值的方法
2014/06/11 Javascript
javascript基本类型详解
2014/11/28 Javascript
JS特效实现图片自动播放并可控的效果
2015/07/31 Javascript
微信小程序 toast 详解及实例代码
2016/11/09 Javascript
简单实现AngularJS轮播图效果
2020/04/10 Javascript
vue自定义指令之面板拖拽的实现
2019/04/14 Javascript
vue(2.x,3.0)配置跨域代理
2019/11/27 Javascript
在vue和element-ui的table中实现分页复选功能
2019/12/04 Javascript
[01:13:17]Secret vs NB 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
Python获取文件所在目录和文件名的方法
2017/01/12 Python
Python3 加密(hashlib和hmac)模块的实现
2017/11/23 Python
python 将字符串转换成字典dict的各种方式总结
2018/03/23 Python
python实现雨滴下落到地面效果
2018/06/21 Python
python 字符串和整数的转换方法
2018/06/25 Python
python顺序执行多个py文件的方法
2019/06/29 Python
解决virtualenv -p python3 venv报错的问题
2021/02/05 Python
一款纯css3实现简单的checkbox复选框和radio单选框
2014/11/05 HTML / CSS
SportsDirect.com马来西亚:英国第一体育零售商
2018/11/21 全球购物
银行会计业务的个人自我评价
2013/11/02 职场文书
工程力学硕士生的自我评价范文
2013/11/16 职场文书
高二美术教学反思
2014/01/14 职场文书
小学少先队活动方案
2014/02/18 职场文书
领导干部作风建设总结
2014/10/23 职场文书
新郎答谢词
2015/01/04 职场文书
试用期工作表现自我评价
2015/03/06 职场文书
运动会主持人开幕词
2016/03/04 职场文书
常用的Python代码调试工具总结
2021/06/23 Python
聊聊基于pytorch实现Resnet对本地数据集的训练问题
2022/03/25 Python