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 kill不掉线程的原因
May 07 MySQL
MySQL Threads_running飙升与慢查询的相关问题解决
May 08 MySQL
详解MySQL集群搭建
May 26 MySQL
详解MySQL多版本并发控制机制(MVCC)源码
Jun 23 MySQL
MySQL修改默认引擎和字符集详情
Sep 25 MySQL
MySQL七种JOIN类型小结
Oct 24 MySQL
MySQL 开窗函数
Feb 15 MySQL
MySQL创建管理HASH分区
Apr 13 MySQL
Windows 64位 安装 mysql 8.0.28 图文教程
Apr 19 MySQL
MySQL如何使备份得数据保持一致
May 02 MySQL
mysql序号rownum行号实现方式
Dec 24 MySQL
DQL数据查询语句使用示例
Dec 24 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
咖啡知识 咖啡养豆要养多久 排气又是什么
2021/03/06 新手入门
php self,$this,const,static,->的使用
2009/10/22 PHP
php连接mssql数据库的几种方法
2013/02/21 PHP
yii实现创建验证码实例解析
2014/07/31 PHP
php正则表达式获取内容所有链接
2015/07/24 PHP
PHP实现生成推广海报的方法详解
2018/03/14 PHP
PHP实现的无限分类类库定义与用法示例【基于thinkPHP】
2018/08/06 PHP
PHP __call()方法实现委托示例
2019/05/20 PHP
JavaScript和ActionScript的交互实现代码
2010/08/01 Javascript
jquery分割字符串的方法
2015/06/24 Javascript
Node.js开启Https的实践详解
2016/10/25 Javascript
JS中Select下拉列表类(支持输入模糊查询)功能
2017/01/17 Javascript
JS仿淘宝搜索框用户输入事件的实现
2017/06/19 Javascript
微信小程序实现slideUp、slideDown滑动效果及点击空白隐藏功能示例
2018/12/11 Javascript
如何使用Node.js爬取任意网页资源并输出PDF文件到本地
2019/06/17 Javascript
原生js+css调节音量滑块
2020/01/15 Javascript
viewer.js实现图片预览功能
2020/06/24 Javascript
vue+swiper实现左右滑动的测试题功能
2020/10/30 Javascript
python下如何让web元素的生成更简单的分析
2008/07/17 Python
python实现批量按比例缩放图片效果
2018/03/30 Python
解决python 自动安装缺少模块的问题
2018/10/22 Python
Python模块的加载讲解
2019/01/15 Python
使用python实现ftp的文件读写方法
2019/07/02 Python
Python API自动化框架总结
2019/11/12 Python
解析pip安装第三方库但PyCharm中却无法识别的问题及PyCharm安装第三方库的方法教程
2020/03/10 Python
Brasty波兰:香水、化妆品、手表网上商店
2019/04/15 全球购物
工程部主管岗位职责
2013/11/17 职场文书
社区志愿者活动总结
2014/06/26 职场文书
2014乡镇机关党员个人对照检查材料思想汇报
2014/10/09 职场文书
先进基层党组织材料
2014/12/25 职场文书
未中标通知书
2015/04/17 职场文书
2016幼儿教师自荐信范文
2016/01/28 职场文书
2016年小学端午节活动总结
2016/04/01 职场文书
python实现Nao机器人的单目测距
2021/09/04 Python
浅谈Redis跟MySQL的双写问题解决方案
2022/02/24 Redis
深入解析Apache Hudi内核文件标记机制
2022/03/31 Servers