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 27 MySQL
Mysql基础知识点汇总
May 26 MySQL
MYSQL数据库使用UTF-8中文编码乱码的解决办法
May 26 MySQL
详细谈谈MYSQL中的COLLATE是什么
Jun 11 MySQL
python中的mysql数据库LIKE操作符详解
Jul 01 MySQL
MySQL 5.7常见数据类型
Jul 15 MySQL
MySQL数据库必备之条件查询语句
Oct 15 MySQL
Mysql数据库手动及定时备份步骤
Nov 07 MySQL
mysql 乱码 字符集latin1转UTF8
Apr 19 MySQL
MySQL批量更新不同表中的数据
May 11 MySQL
MySQL主从切换的超详细步骤
Jun 28 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
在IIS上安装PHP4.0正式版
2006/10/09 PHP
php简单静态页生成过程
2008/03/27 PHP
PHP syntax error, unexpected $end 错误的一种原因及解决
2008/10/25 PHP
关于IIS php调用com组件的权限问题
2012/01/11 PHP
Laravel框架中Blade模板的用法示例
2017/08/30 PHP
golang实现php里的serialize()和unserialize()序列和反序列方法详解
2018/10/30 PHP
Yii框架 session 数据库存储操作方法示例
2019/11/18 PHP
JS 文件大小判断的实现代码
2010/04/07 Javascript
$.each与$().each的区别示例介绍
2014/03/20 Javascript
jQuery实现带滚动线条导航效果的方法
2015/01/30 Javascript
js实现iframe自动自适应高度的方法
2015/02/17 Javascript
javascript封装 Cookie 应用接口
2015/08/07 Javascript
javascript时间排序算法实现活动秒杀倒计时效果
2021/01/28 Javascript
canvas实现图像截取功能
2017/02/06 Javascript
JavaScrip数组删除特定元素的几种方法总结
2017/09/06 Javascript
vue 避免变量赋值后双向绑定的操作
2020/11/07 Javascript
[03:42]2014DOTA2西雅图国际邀请赛 Navi战队巡礼
2014/07/07 DOTA
Django中实现点击图片链接强制直接下载的方法
2015/05/14 Python
Python实现股市信息下载的方法
2015/06/15 Python
python实现用户登录系统
2016/05/21 Python
windows上安装Anaconda和python的教程详解
2017/03/28 Python
Python实现购物车购物小程序
2018/04/18 Python
使用Python第三方库pygame写个贪吃蛇小游戏
2020/03/06 Python
Python Django2 model 查询介绍(条件、范围、模糊查询)
2020/03/16 Python
python topk()函数求最大和最小值实例
2020/04/02 Python
python基于opencv 实现图像时钟
2021/01/04 Python
HTML5中form如何关闭自动完成功能的方法
2018/07/02 HTML / CSS
Canvas实现贝赛尔曲线轨迹动画的示例代码
2019/04/25 HTML / CSS
后勤岗位职责
2013/11/26 职场文书
药品促销活动方案
2014/02/14 职场文书
电脑售后服务承诺书
2014/03/27 职场文书
反邪教标语
2014/06/23 职场文书
2015年化验室工作总结
2015/04/23 职场文书
趣味运动会口号
2015/12/24 职场文书
如何在Python中妥善使用进度条详解
2022/04/05 Python
python中Pyqt5使用Qlabel标签播放视频
2022/04/22 Python