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 root密码的重置方法
Apr 21 MySQL
详解MySQL的半同步
Apr 22 MySQL
mysql对于模糊查询like的一些汇总
May 09 MySQL
.Net Core导入千万级数据至Mysql的步骤
May 24 MySQL
Navicat连接MySQL错误描述分析
Jun 02 MySQL
Mysql实现主从配置和多主多从配置
Jun 02 MySQL
mysql left join快速转inner join的过程
Jun 30 MySQL
MySQL创建定时任务
Jan 22 MySQL
MySQL为数据表建立索引的原则详解
Mar 03 MySQL
一条 SQL 语句执行过程
Mar 17 MySQL
MySQL详解进行JDBC编程与增删改查方法
Jun 16 MySQL
Mysql如何查看是否使用到索引
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
让这部DC动画新作刷新你的认知
2020/03/03 欧美动漫
php 搜索框提示(自动完成)实例代码
2012/02/05 PHP
java解析json方法总结
2019/05/16 PHP
基于jquery的表格排序
2010/09/11 Javascript
Jquery实现搜索框提示功能示例代码
2013/08/13 Javascript
用js代码改变单选框选中状态的简单实例
2013/12/18 Javascript
js字符串日期yyyy-MM-dd转化为date示例代码
2014/03/06 Javascript
设计模式中的组合模式在JavaScript程序构建中的使用
2016/05/18 Javascript
AngularJS指令用法详解
2016/11/02 Javascript
jQuery实现的响应鼠标移动方向插件用法示例【附源码下载】
2018/08/28 jQuery
详解关于html,css,js三者的加载顺序问题
2019/04/10 Javascript
原生JS实现留言板功能
2020/02/08 Javascript
javascript实现获取中文汉字拼音首字母
2020/05/19 Javascript
react结合bootstrap实现评论功能
2020/05/30 Javascript
Python的gevent框架的入门教程
2015/04/29 Python
Python 数据结构之队列的实现
2017/01/22 Python
Django中自定义查询对象的具体使用
2019/10/13 Python
tensorflow-gpu安装的常见问题及解决方案
2020/01/20 Python
基于Django signals 信号作用及用法详解
2020/03/28 Python
Python xlrd模块导入过程及常用操作
2020/06/10 Python
捷克多品牌在线时尚商店:ANSWEAR.cz
2020/10/03 全球购物
科颜氏香港官方网店:Kiehl’s香港
2021/03/07 全球购物
学习心得体会
2014/01/01 职场文书
庆七一活动方案
2014/01/25 职场文书
2014年道德讲堂实施方案
2014/03/05 职场文书
2014年圣诞节促销方案
2014/03/14 职场文书
勾股定理课后反思
2014/04/26 职场文书
机关领导干部作风整顿整改措施
2014/09/19 职场文书
村长反四风问题个人对照检查材料
2014/09/21 职场文书
邀请函的格式
2015/01/30 职场文书
本科毕业论文致谢词
2015/05/14 职场文书
Python多线程 Queue 模块常见用法
2021/07/04 Python
在Spring-Boot中如何使用@Value注解注入集合类
2021/08/02 Java/Android
MySQL连接控制插件介绍
2021/09/25 MySQL
python数字类型和占位符详情
2022/03/13 Python
Java 超详细讲解十大排序算法面试无忧
2022/04/08 Java/Android