DBshop日记3

乐云一
  • 开发日记
  • 开发日记
About 1235 wordsAbout 4 min

于2023-11-09日记录

以上为目前工具的使用,简单的概括:功能以完成,剩下的就交给时间。

并且对比功能,数据库之间对比这一实际的投入到了我平时和同事的开发使用中,效果比预想中的要好的多。

在没有复杂情况中,比如复合主键、在未找到转换规则定义中的特殊字段、非常用索引...,已经可以做到稍作检查就可以直接使用自动生成出来的Sql。

有成果的收获更令人美味

开发小结

在日记2open in new window的记录中,有提到Sql语句的自动解析,这方面也是到目前为止最费力的环节。

SQL解析

首先Sql语句总类很多,

  • 新增字段
  • 修改字段
  • 创建表
  • 删除表主键
  • 删除自增
  • 新增自增
  • ....

在最开始的设计中,解析流程大致如下:

  1. 两表对比,发现有差异,根据类型、名字等因素定位到具体表的具体字段
  2. 根据主从表设置,决定该字段需要生成 新增\修改\删除 类型SQL
  3. 调用工具,通过Sql模板的设置生成对应类型的字符串
  4. 执行字段类型转换策略

在早期设置sql类型少的时候,只需要添加工具中对于各类型SQL的生成方式的逻辑就好。

但是当遇到创建表,表中设置自增、主键、索引...这种组合型的复合类型,随着类型增多,愈加难以维护。

最终 流程3,调用工具,采取了设计模式中策略模式的设计。

将各个类型的SQL对应到具体策略中,复合型SQL则只需要建立起策略执行链路,就可以非常直观的完成一次例如建表的SQL语句。

所以设计了SQL语句解析这套链路后,有了一个非常深的体会: 策略模式真TM好用

由其在结合了日记2中的抽线策略工厂后,整个代码体系在开发感观上有一个质的提升

类型转换

除了核心功能的Sql语句自动解析外,字段的类型设置与实际想要得到的这一点,也是一个非常重要的扩展点

并且由于 Java中原生JDBC对各数据库类型的弱化获取,导致 DatabaseMetaData 中拿到的字段与在数据库中设置的会存在偏差。

比如在Mysql中,datetime 类型在默认设置中,被 DatabaseMetaData 解析出来的会是 datatime(26) ;

tinyint(1) 会变成 bit(1)

json 会变成 json(65535)

...

因此,在Sql生成后,还需要通过自定义去勾选或添加转换类型,将 datetime(?) 变成 datetime(0) 这样符号日常需要的Sql类型

关于类型转换规则的种类,也随着在使用过程中发现各类类型在原生中的解析偏差,比如 Longtext ...

所以这部分功能的完善也只能慢慢的交给时间

核心对比逻辑

简单的梳理流程:

  1. 加载两个对比的数据库数据,并且以 数据库-List<表> 表-List<字段> 进行本地的缓存存储
  2. 遍历其中一个数据库的表,另一个数据库的表生成 name 的字典,初次判断将名字不相同,即一个库存在,另一个不存在的表打上差异标识。
  3. 将遍历结果解析,如果有差异标识,则根据主从表生成对应主表的 创建表 或 删除表 Sql。
  4. 如果没有差异标识,则继续比对两表的字段差异,从字段名、字段类型、字段长度、自增属性、主键属性、备注依次判断
  5. 根据步骤4的结果生成对应差异的语句,比如字段名差异,则说明新增或删除字段,类型、长度、备注则说明更新字段...
  6. 将最终结果sql推入到类型转换策略器中
  7. 打印最终结果集

大致方向就是以上7点,使用事实证明,确实可以完成非常有效的数据库对比逻辑判断

未来

目前除了继续完善维护已经完成的数据库对比功能,还会考虑以下:

  • 自动筛选项目中未用到的表
  • 自动判断项目中实体类与表的字段差异
  • 网页端的使用

其中1和2是突发灵感想到的需求,3则是必须要做的。

果然需求来源于生活,在我烦恼数据库中哪些表是废表的时候,需求就此诞生了

Last update:
Contributors: LeYunone
Comments
  • Latest
  • Oldest
  • Hottest
Powered by Waline v2.14.7