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 26 MySQL
MySQL非空约束(not null)案例讲解
Aug 23 MySQL
MySQL和Oracle批量插入SQL的通用写法示例
Nov 17 MySQL
mysql中varchar类型的日期进行比较、排序等操作的实现
Nov 17 MySQL
浅谈mysql哪些情况会导致索引失效
Nov 20 MySQL
Linux7.6二进制安装Mysql8.0.27详细操作步骤
Nov 27 MySQL
进阶篇之linux环境下安装MySQL数据库
Apr 09 MySQL
MySql重置root密码 --skip-grant-tables
Apr 11 MySQL
Mysql 8.x 创建用户以及授予权限的操作记录
Apr 18 MySQL
CentOS MySql8 远程连接实战
Apr 19 MySQL
单机多实例部署 MySQL8.0.20
May 15 MySQL
浅谈MySql update会锁定哪些范围的数据
Jun 25 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 is_file 判断给定文件名是否为一个正常的文件
2010/05/10 PHP
php操作excel文件 基于phpexcel
2010/07/02 PHP
php在程序中将网页生成word文档并提供下载的代码
2012/10/09 PHP
将FCKeditor导入PHP+SMARTY的实现方法
2015/01/15 PHP
php调整服务器时间的方法
2015/04/03 PHP
PHP实现的最大正向匹配算法示例
2017/12/19 PHP
Laravel框架使用Seeder实现自动填充数据功能
2018/06/13 PHP
脚本吧 - 幻宇工作室用到js,超强推荐expand.js
2006/12/23 Javascript
js获取和设置属性的方法
2014/02/20 Javascript
cocos2dx骨骼动画Armature源码剖析(三)
2015/09/08 Javascript
Window.Open打开窗体和if嵌套代码
2016/04/15 Javascript
JS组件Bootstrap dropdown组件扩展hover事件
2016/04/17 Javascript
清除浏览器缓存的几种方法总结(必看)
2016/12/09 Javascript
JS实现发送短信验证后按钮倒计时功能(防止刷新倒计时失效)
2017/07/07 Javascript
vue基于mint-ui的城市选择3级联动的示例
2017/10/25 Javascript
NodeJS安装图文教程
2018/04/19 NodeJs
使用vue完成微信公众号网页小记(推荐)
2019/04/28 Javascript
vue接入腾讯防水墙代码
2019/05/07 Javascript
Vue 无限滚动加载指令实现方法
2019/05/28 Javascript
小程序识别身份证,银行卡,营业执照,驾照的实现
2019/11/05 Javascript
[55:18]Liquid vs Chaos 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/16 DOTA
Python contextlib模块使用示例
2015/02/18 Python
Python自动化开发学习之三级菜单制作
2017/07/14 Python
PyQt实现界面翻转切换效果
2018/04/20 Python
python爬虫_实现校园网自动重连脚本的教程
2018/04/22 Python
Python 3 判断2个字典相同
2019/08/06 Python
django美化后台django-suit的安装配置操作
2020/07/12 Python
发现两个有趣的CSS3动画效果
2013/08/14 HTML / CSS
HTML5中5个简单实用的API(第二篇,含全屏、可见性、拍照、预加载、电池状态)
2014/05/07 HTML / CSS
AHAVA美国官方网站:死海海泥护肤品牌
2016/10/18 全球购物
会话Bean的种类
2013/11/07 面试题
小学学校门卫岗位职责
2014/08/03 职场文书
委托书的样本
2015/01/28 职场文书
Go 语言中 20 个占位符的整理
2021/10/16 Golang
配置Kubernetes外网访问集群
2022/03/31 Servers
零基础学java之带返回值的方法的定义和调用
2022/04/10 Java/Android