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 05 MySQL
MySQL pt-slave-restart工具的使用简介
Apr 07 MySQL
MySQL kill不掉线程的原因
May 07 MySQL
MySQL 分页查询的优化技巧
May 12 MySQL
MySQL注入基础练习
May 30 MySQL
MySQL系列之八 MySQL服务器变量
Jul 02 MySQL
MySQL中的引号和反引号的区别与用法详解
Oct 24 MySQL
MySQL学习之基础命令实操总结
Mar 19 MySQL
MySQL导致索引失效的几种情况
Jun 25 MySQL
mysql sock文件存储了什么信息
Jul 15 MySQL
MySQL表字段数量限制及行大小限制详情
Jul 23 MySQL
Mysql中mvcc各场景理解应用
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程序?
2006/12/08 PHP
ThinkPHP控制器里javascript代码不能执行的解决方法
2014/11/22 PHP
配置Nginx+PHP的正确思路与过程
2016/05/10 PHP
浅谈php中的访问修饰符private、protected、public的作用范围
2016/11/20 PHP
PHP 序列化和反序列化函数实例详解
2020/07/18 PHP
在Laravel 中实现是否关注的示例
2019/10/22 PHP
TP5框架model常见操作示例小结【增删改查、聚合、时间戳、软删除等】
2020/04/05 PHP
游戏人文件夹程序 ver 4.03
2006/07/14 Javascript
FF火狐下获取一个元素同类型的相邻元素实现代码
2012/12/15 Javascript
jqGrid中文文档之选项设置
2015/12/02 Javascript
javascript中eval解析JSON字符串
2016/02/27 Javascript
微信js-sdk界面操作接口用法示例
2016/10/12 Javascript
Bootstrap模态框案例解析
2017/03/05 Javascript
jQuery插件FusionWidgets实现的AngularGauge图效果示例【附demo源码】
2017/03/23 jQuery
单行 JS 实现移动端金钱格式的输入规则
2017/05/22 Javascript
vue.js 获取当前自定义属性值
2017/06/01 Javascript
图文介绍Vue父组件向子组件传值
2018/02/17 Javascript
使用Object.defineProperty如何巧妙找到修改某个变量的准确代码位置
2018/11/02 Javascript
vue实现下载文件流完整前后端代码
2020/11/17 Vue.js
微信小程序弹窗禁止页面滚动的实现代码
2020/12/30 Javascript
[04:23]DOTA2上海特锦赛小组赛第一日 TOP10精彩集锦
2016/02/27 DOTA
[01:56]生活中的妖精之七夕特别档
2016/08/09 DOTA
将图片文件嵌入到wxpython代码中的实现方法
2014/08/11 Python
python实现将内容分行输出
2015/11/05 Python
Python爬取网易云音乐上评论火爆的歌曲
2017/01/19 Python
在django中使用自定义标签实现分页功能
2017/07/04 Python
python八皇后问题的解决方法
2018/09/27 Python
pandas实现将日期转换成timestamp
2019/12/07 Python
TENSORFLOW变量作用域(VARIABLE SCOPE)
2020/01/10 Python
Python xlwt模块使用代码实例
2020/06/10 Python
自我反省检讨书
2014/01/23 职场文书
护理目标管理责任书
2014/07/25 职场文书
年检委托书
2014/08/30 职场文书
文明单位汇报材料
2014/12/24 职场文书
违纪检讨书范文
2015/01/27 职场文书
幼儿园老师新年寄语
2015/08/17 职场文书