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 06 MySQL
zabbix监控mysql的实例方法
Jun 02 MySQL
MySQL索引失效的典型案例
Jun 05 MySQL
MySQL 时间类型的选择
Jun 05 MySQL
MySQL 数据恢复的多种方法汇总
Jun 21 MySQL
mysql事务对效率的影响分析总结
Oct 24 MySQL
基于MySql验证的vsftpd虚拟用户
Nov 07 MySQL
防止web项目中的SQL注入
Dec 06 MySQL
一文简单了解MySQL前缀索引
Apr 03 MySQL
mysql 体系结构和存储引擎介绍
May 06 MySQL
MySQL串行化隔离级别(间隙锁实现)
Jun 16 MySQL
MySQL数据库之内置函数和自定义函数 function
Jun 16 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
基于header的一些常用指令详解
2013/06/06 PHP
PHP中empty和isset对于参数结构的判断及empty()和isset()的区别
2015/11/15 PHP
PHP的微信支付接口使用方法讲解
2019/03/08 PHP
php ActiveMQ的安装与使用方法图文教程
2020/02/23 PHP
基于jquery的高性能td和input切换并可修改内容实现代码
2011/01/09 Javascript
通过javascript获取iframe里的值示例代码
2013/06/24 Javascript
javascript:void(0)是什么意思示例介绍
2013/11/17 Javascript
实例讲解jquery中mouseleave和mouseout的区别
2016/02/17 Javascript
JS中setTimeout的巧妙用法前端函数节流
2016/03/24 Javascript
IOS中safari下的select下拉菜单文字过长不换行的解决方法
2016/09/26 Javascript
JS比较两个数值的大小实例
2016/11/25 Javascript
Bootstrap CSS使用方法
2016/12/23 Javascript
jQuery插件form-validation-engine正则表达式操作示例
2017/02/09 Javascript
js获取json中key所对应的value值的简单方法
2020/06/17 Javascript
Vue-cli项目获取本地json文件数据的实例
2018/03/07 Javascript
vue 重塑数组之修改数组指定index的值操作
2020/08/09 Javascript
[02:18]《我与DAC》之工作人员:为了热爱DOTA2的玩家们
2018/03/28 DOTA
[01:05:52]DOTA2-DPC中国联赛 正赛 Ehome vs Aster BO3 第一场 2月2日
2021/03/11 DOTA
分析在Python中何种情况下需要使用断言
2015/04/01 Python
python Selenium爬取内容并存储至MySQL数据库的实现代码
2017/03/16 Python
pandas groupby 分组取每组的前几行记录方法
2018/04/20 Python
对Python 窗体(tkinter)树状数据(Treeview)详解
2018/10/11 Python
使用Python 正则匹配两个特定字符之间的字符方法
2018/12/24 Python
python 实现字符串下标的输出功能
2020/02/13 Python
python 解决tqdm模块不能单行显示的问题
2020/02/19 Python
pytorch中的weight-initilzation用法
2020/06/24 Python
Django2.1.7 查询数据返回json格式的实现
2020/12/29 Python
化学教学随笔感言
2014/02/19 职场文书
入党思想汇报怎么写
2014/04/03 职场文书
药品业务员岗位职责
2014/04/17 职场文书
商务助理求职信范文
2014/04/20 职场文书
银行竞聘演讲稿范文
2014/04/23 职场文书
小学竞选班干部演讲稿
2014/08/20 职场文书
实施意见格式范本
2015/06/05 职场文书
浅谈如何提高PHP代码的质量
2021/05/28 PHP
攻略丨滑雪究竟该选哪款对讲机?
2022/02/18 无线电