mysql表结构设计分享(MySql开发之自动同步表结构)
类别:数据库 浏览量:1862
时间:2021-10-01 01:09:15 mysql表结构设计分享
MySql开发之自动同步表结构开发痛点
在开发过程中,由于频繁的修改数据库的字段,导致rd和qa环境的数据库表经常不一致。
而由于这些修改数据库的操作可能由多个rd操作,很难一次性收集全。人手工去和qa环境对字段又特别繁琐,容易遗漏。
解决之道
于是笔者就写了一个能够自动比较两个数据库的表结构,并生成alter语句的程序。同时还可以进行配置从而自动这行这些alter语句。详情见github
原理
同步新增的表
如果rd环境新增的表,而qa环境没有,此程序可以直接输出create table语句。原理如下:
用到的sql主要有:
show table from rd_db; show create table added_table_name;
同步表结构
如果rd表结构有改动,而qa环境没有,此程序可以直接输出alter语句,原理如下:
用到的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自动同步表结构内容请搜索开心学习网以前的文章或继续浏览下面的相关文章希望大家以后多多支持开心学习网!
原文链接:https://my.oschina.net/alchemystar/blog/858996
您可能感兴趣
- mysql 删除数据回收空间(浅谈为什么MySQL不建议delete删除数据)
- mysql插入数据错误代码(教你解决往mysql数据库中存入汉字报错的方法)
- mysqlselect语句汇总(MySQL Select语句是如何执行的)
- MySql存储过程
- mysql修改复杂密码设置(MySQL修改密码的几种方式)
- mysql用什么类型数据(MySQL 数据类型选择原则)
- 怎么将mysql彻底卸载(如何把Mysql卸载干净亲测有效)
- mysql数据库导入错误怎么处理(MySQL数据库导入导出数据之报错解答实例讲解)
- mysql和explain哪个好(MySQL EXPLAIN输出列的详细解释)
- mysql url连接参数配置(浅谈Mysql连接数据库时host和user的匹配规则)
- mysql学习之索引介绍及其原理(MySQL学习教程之聚簇索引)
- mysql读写分离同步策略(Mysql主从复制与读写分离图文详解)
- 如何安装phpmysql环境(phpnow重新安装mysql数据库的方法)
- mysql数据库如何删除重复记录(mysql数据库删除重复数据只保留一条方法实例)
- mysqljoin语句用法(MySQL的join buffer原理)
- mysql一般使用的事务隔离级别(详解MySQL中事务隔离级别的实现原理)
- 营养餐是什么(学校营养餐是什么)
- 谁说女子不如男 范冰冰演的武则天只是其一,另外两位你认识吗(谁说女子不如男)
- 杯酒人生---瓦伦丁酒杯和奥丁格啤酒(杯酒人生---瓦伦丁酒杯和奥丁格啤酒)
- 中秋节买啤酒,预算超过7元试试这8种啤酒,麦香浓郁都是真啤酒(预算超过7元试试这8种啤酒)
- CellPress旗下的6 期刊,国人友刊来了解一下吧(CellPress旗下的6期刊国人友刊来了解一下吧)
- ()
热门推荐
- python中如何限制数字的个数(python 处理数字,把大于上限的数字置零实现方法)
- php脚本控制方法(php swoole多进程/多线程用法示例基于php7nts版)
- nginx给需要转发的链接添加参数(Nginx 根据URL带的参数转发的实现)
- 5款好用的ftp软件推荐(10个最好的免费FTP客户端软件)
- mysql事务特性和隔离级别(Mysql事务特性和级别原理解析)
- element-ui 菜单悬停样式(js如何构造elementUI树状菜单的数据结构详解)
- docker显示容器的gc日志(解决docker使用GDB,无法进入断点的问题)
- php读取远程的txt文件(php 根据URL下载远程图片、压缩包、pdf等文件到本地)
- php查询数据库给变量赋值(详解PHP变量传值赋值和引用赋值变量销毁)
- SQL如何操作Xml字段
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9