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 InnoDB存储引擎的内存管理
Apr 08 MySQL
MySQL 8.0 之不可见列的基本操作
May 20 MySQL
mysql在项目中怎么选事务隔离级别
May 25 MySQL
浅谈mysql增加索引不生效的几种情况
Jun 23 MySQL
SQL之各种join小结详细讲解
Aug 04 MySQL
SQL实现LeetCode(178.分数排行)
Aug 04 MySQL
详细聊聊MySQL中慢SQL优化的方向
Aug 30 MySQL
MySQL七种JOIN类型小结
Oct 24 MySQL
防止web项目中的SQL注入
Dec 06 MySQL
MySQL的索引你了解吗
Mar 13 MySQL
mysql 8.0.27 绿色解压版安装教程及配置方法
Apr 20 MySQL
MySQL中正则表达式(REGEXP)使用详解
Jul 07 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与php MySQL 之间的关系
2009/07/17 PHP
关于php操作mysql执行数据库查询的一些常用操作汇总
2013/06/24 PHP
Laravel框架表单验证详解
2014/09/04 PHP
php单链表实现代码分享
2016/07/04 PHP
PHP实现驼峰样式字符串(首字母大写)转换成下划线样式字符串的方法示例
2017/08/10 PHP
PHP单例模式模拟Java Bean实现方法示例
2018/12/07 PHP
ExtJS 2.2.1的grid控件在ie6中的显示问题
2009/05/04 Javascript
JS 加入收藏夹的代码(主流浏览器通用)
2013/05/13 Javascript
最好用的省市二级联动 原生js实现你值得拥有
2013/09/22 Javascript
js为空或不是对象问题的快速解决方法
2013/12/11 Javascript
jQuery超酷平面式时钟效果代码分享
2020/03/30 Javascript
详解javascript函数的参数
2015/11/10 Javascript
通过node-mysql搭建Windows+Node.js+MySQL环境的教程
2016/03/01 Javascript
详解原生JavaScript实现jQuery中AJAX处理的方法
2016/05/10 Javascript
Bootstrap基本组件学习笔记之分页(12)
2016/12/08 Javascript
Jquery把获取到的input值转换成json
2017/05/15 jQuery
vue jsx 使用指南及vue.js 使用jsx语法的方法
2017/11/11 Javascript
利用vue和element-ui设置表格内容分页的实例
2018/03/02 Javascript
vue-router命名视图的使用讲解
2019/01/19 Javascript
微信小程序实现授权登录
2019/05/15 Javascript
vue  elementUI 表单嵌套验证的实例代码
2019/11/06 Javascript
利用Python抓取行政区划码的方法
2016/11/28 Python
Python3 socket同步通信简单示例
2017/06/07 Python
Python 模拟员工信息数据库操作的实例
2017/10/23 Python
Python Numpy:找到list中的np.nan值方法
2018/10/30 Python
Django多数据库配置及逆向生成model教程
2020/03/28 Python
python实现图片素描效果
2020/09/26 Python
python设置中文界面实例方法
2020/10/27 Python
英国DIY和家居装饰领域的主要品牌:Wickes
2019/11/26 全球购物
质检部经理岗位职责
2014/02/19 职场文书
2014年维修工作总结
2014/11/22 职场文书
师德师风个人总结
2015/02/06 职场文书
2015年小学美术工作总结
2015/05/25 职场文书
警示教育观后感
2015/06/17 职场文书
《好妈妈胜过好老师》:每个孩子的优秀都是有源头的
2020/01/03 职场文书
Vue.js中v-for指令的用法介绍
2022/03/13 Vue.js