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 COUNT函数的使用与优化
May 10 MySQL
MYSQL(电话号码,身份证)数据脱敏的实现
May 28 MySQL
MySQL 常见的数据表设计误区汇总
Jun 07 MySQL
MySQL去除重叠时间求时间差和的实现
Aug 23 MySQL
Mysql关于数据库是否应该使用外键约束详解说明
Oct 24 MySQL
Mysql Innodb存储引擎之索引与算法
Feb 15 MySQL
MySQL事务操作的四大特性以及并发事务问题
Apr 12 MySQL
详解Mysq MVCC多版本的并发控制
Apr 29 MySQL
sql查询语句之平均分、最高最低分及排序语句
May 30 MySQL
MySQL运行报错:“Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggre”解决方法
Jun 14 MySQL
MYSQL中文乱码问题的解决方案
Jun 14 MySQL
mysql sock文件存储了什么信息
Jul 15 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
wiki-shan写的php在线加密的解密程序
2008/09/07 PHP
php auth_http类库进行身份效验
2009/03/19 PHP
PHP+MySQL统计该库中每个表的记录数并按递减顺序排列的方法
2016/02/15 PHP
php设计模式之模板模式实例分析【星际争霸游戏案例】
2020/03/24 PHP
JavaScript脚本性能优化注意事项
2008/11/18 Javascript
Js从头学起(基本数据类型和引用类型的参数传递详细分析)
2012/02/16 Javascript
Javascript级联下拉菜单以及AJAX数据验证核心代码
2013/05/10 Javascript
php 中序列化和json使用介绍
2013/07/08 Javascript
javascript 寻找错误方法整理
2014/06/15 Javascript
如何判断Javascript对象是否存在的简单实例
2016/05/18 Javascript
基于JavaScript实现带缩略图的轮播效果
2017/01/12 Javascript
基于jQuery实现咖啡订单管理简单应用
2017/02/10 Javascript
基于JavaScript实现报警器提示音效果
2017/10/27 Javascript
js判断文件类型大小并给出提示的实现方法
2018/01/03 Javascript
jQuery分组选择器简单用法示例
2019/04/04 jQuery
javascript自定义日期比较函数用法示例
2019/07/22 Javascript
vue 获取视频时长的实例代码
2019/08/20 Javascript
js blob类型url的视频下载问题的解决
2019/11/29 Javascript
Vue绑定用户接口实现代码示例
2020/11/04 Javascript
javascript实现简单留言板案例
2021/02/09 Javascript
python使用htmllib分析网页内容的方法
2015/05/08 Python
Python字符和字符值(ASCII或Unicode码值)转换方法
2015/05/21 Python
python开发之tkinter实现图形随鼠标移动的方法
2015/11/11 Python
python通过txt文件批量安装依赖包的实现步骤
2019/08/13 Python
Python qrcode 生成一个二维码的实例详解
2020/02/12 Python
eHarmony英国:全球领先的认真恋爱约会平台之一
2020/11/16 全球购物
教师自荐信范文
2013/12/09 职场文书
高校辅导员推荐信范文
2013/12/25 职场文书
土地转让协议书
2014/04/15 职场文书
《海伦?凯勒》教学反思
2014/04/17 职场文书
白莲教口号
2014/06/18 职场文书
门市房租房协议书
2014/12/04 职场文书
新郎父母婚礼致辞
2015/07/27 职场文书
煤矿施工安全协议书
2016/03/22 职场文书
浅谈Python数学建模之数据导入
2021/06/23 Python
Python编程中Python与GIL互斥锁关系作用分析
2021/09/15 Python