MySql开发之自动同步表结构

 更新时间:2021年05月28日 08:44:16   作者:无毁的湖光-Al  
这篇文章主要给大家介绍了关于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自动同步表结构内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • MySQL中使用SQL语句对字段进行重命名

    MySQL中使用SQL语句对字段进行重命名

    MySQL中,如何使用SQL语句来对表中某一个字段进行重命名呢?我们将使用alter table 这一SQL语句,需要的朋友可以参考下
    2016-04-04
  • Mysql DNS反向解析导致连接超时过程分析(skip-name-resolve)

    Mysql DNS反向解析导致连接超时过程分析(skip-name-resolve)

    从其它地方连接MySQL数据库的时候,有时候很慢。慢的原因有可能是MySQL进行反向DNS解析造成的,这里简单介绍下原理,需要的朋友可以参考下
    2013-03-03
  • mysql 主从复制如何跳过报错

    mysql 主从复制如何跳过报错

    这篇文章主要介绍了mysql 主从复制如何跳过报错,帮助大家更好的理解和使用MySQL 数据库,感兴趣的朋友可以了解下
    2020-10-10
  • Oracle与MySQL的区别及优缺点

    Oracle与MySQL的区别及优缺点

    这篇文章主要介绍了Oracle与MySQL的区别及优缺点,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参加一下
    2022-08-08
  • mysql 5.7.18 winx64安装配置方法图文教程

    mysql 5.7.18 winx64安装配置方法图文教程

    这篇文章主要为大家详细介绍了windows7下mysql 5.7.18 winx64安装配置方法图文教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-04-04
  • Mysql sql慢查询监控脚本代码实例

    Mysql sql慢查询监控脚本代码实例

    这篇文章主要介绍了Mysql sql慢查询监控脚本代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-11-11
  • 关于MySQL的存储过程与存储函数

    关于MySQL的存储过程与存储函数

    存储过程是在大型数据库系统中,一组为了完成特定功能的SQL 语句集(这些SQL语句已经编译过了),它存储在数据库中,一次编译后永久有效,需要的朋友可以参考下
    2023-05-05
  • mysql中varchar类型的日期进行比较、排序等操作的实现

    mysql中varchar类型的日期进行比较、排序等操作的实现

    在mysql使用过程中,日期一般都是以datetime、timestamp等格式进行存储的,但有时会因为特殊的需求或历史原因,日期的存储格式是varchar,那么应该怎么进行比较和排序等问题,本文就来介绍一下
    2021-11-11
  • mysql-8.0.11-winx64.zip安装教程详解

    mysql-8.0.11-winx64.zip安装教程详解

    这篇文章主要介绍了mysql-8.0.11-winx64.zip安装教程详解及注意事项,非常不错,具有参考借鉴价值,需要的朋友参考下
    2018-05-05
  • mysql 列转行的技巧(分享)

    mysql 列转行的技巧(分享)

    下面小编就为大家带来一篇mysql 列转行的技巧(分享)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-03-03

最新评论