logo
0
0
WeChat Login
changningbo<changningbo1995@gmail.com>
``` feat(api): 新增数据库导出SQL功能

DM-Compare - 达梦数据库表结构对比工具

项目简介

DM-Compare 是一个基于 Spring Boot 的达梦数据库表结构对比工具,能够自动对比两个达梦数据库的表结构差异,并生成同步DDL脚本。

主要功能

  • 表结构对比: 自动对比源数据库和目标数据库的表结构差异
  • 智能识别差异:
    • 识别只在源库存在的表(需要在目标库创建)
    • 识别只在目标库存在的表(可选择删除)
    • 识别列的新增、删除和修改
  • DDL脚本生成: 自动生成达梦数据库兼容的同步DDL脚本
  • 类型自动转换:
    • 整数类型优化(移除精度参数)
    • TEXT → CLOB 类型转换
    • 字符长度自动处理
  • 大小写保持: 使用双引号保持表名和列名的原始大小写
  • 配置外部化: 所有数据库配置通过application.yml管理
  • IDE智能提示: 支持IDEA/Eclipse等IDE的配置自动提示

技术栈

  • Java 25
  • Spring Boot 4.0.1
  • 达梦数据库 JDBC驱动 8.1.3.140
  • Maven

快速开始

1. 环境要求

  • JDK 25+
  • Maven 3.6+
  • 达梦数据库

2. 配置数据库连接

编辑 src/main/resources/application.yml:

database: compare: # 源数据库配置 (schema从URL中自动提取) source: url: jdbc:dm://源数据库IP:端口?schema=模式名 username: 用户名 password: 密码 # 目标数据库配置 (schema从URL中自动提取) target: url: jdbc:dm://目标数据库IP:端口?schema=模式名 username: 用户名 password: 密码 # DDL输出文件路径 output: file: sync_ddl.sql

注意: schema会自动从URL中的?schema=XXX参数提取,无需单独配置。

3. 运行项目

# 使用Maven运行 ./mvnw spring-boot:run # 或者打包后运行 ./mvnw clean package java -jar target/dm-compare-0.0.1-SNAPSHOT.jar

4. 查看结果

运行完成后:

  • 控制台会输出详细的对比结果
  • 在项目根目录生成 sync_ddl.sql 文件,包含同步DDL脚本

配置说明

配置项

配置项说明示例
database.compare.source.url源数据库JDBC连接URLjdbc:dm://127.0.0.1:5236?schema=DB1
database.compare.source.username源数据库用户名SYSDBA
database.compare.source.password源数据库密码password123
database.compare.target.url目标数据库JDBC连接URLjdbc:dm://127.0.0.1:5236?schema=DB2
database.compare.target.username目标数据库用户名SYSDBA
database.compare.target.password目标数据库密码password123
database.compare.output.fileDDL输出文件路径sync_ddl.sql

IDE自动提示

项目已配置Spring Boot配置元数据,在IDEA/Eclipse中编辑application.yml时会有智能提示和说明。

生成的DDL示例

-- ======================================== -- 表: user_info (只在源库存在,需要在目标库创建) -- ======================================== CREATE TABLE SCHEMA."user_info" ( "id" BIGINT NOT NULL, "username" VARCHAR(50) NOT NULL, "email" VARCHAR(100), "create_time" TIMESTAMP ); COMMENT ON TABLE SCHEMA."user_info" IS '用户信息表'; COMMENT ON COLUMN SCHEMA."user_info"."id" IS '用户ID'; COMMENT ON COLUMN SCHEMA."user_info"."username" IS '用户名'; -- ======================================== -- 表: product -- ======================================== -- 添加列: description ALTER TABLE SCHEMA."product" ADD "description" VARCHAR(500); -- 修改列: price -- 目标库当前: DECIMAL(10,2) -- 源库定义: DECIMAL(12,2) ALTER TABLE SCHEMA."product" MODIFY "price" DECIMAL(12,2);

核心特性说明

1. 表名大小写处理

程序会保持数据库中表名的原始大小写,并在DDL中使用双引号:

CREATE TABLE SCHEMA."myTable" (...) -- 保持小写

2. 数据类型优化

自动转换为达梦兼容的类型:

  • INT(4)INT
  • BIGINT(8)BIGINT
  • TEXTCLOB

3. 字符长度处理

使用CHAR_LENGTH而不是DATA_LENGTH,确保VARCHAR等字符类型显示正确的字符长度而非字节长度。

4. 注释处理

达梦数据库使用单独的COMMENT ON语句添加注释,而不是在CREATE TABLE中使用COMMENT关键字。

项目结构

dm-compare/ ├── src/main/ │ ├── java/ │ │ └── cn/com/chnenergy/dm/compare/ │ │ ├── DmCompareApplication.java # 主程序 │ │ ├── config/ │ │ │ └── DatabaseCompareConfig.java # 配置类 │ │ └── utils/ │ │ └── DmSchemaComparatorUtils.java # 核心对比工具 │ └── resources/ │ ├── application.yml # 配置文件 │ └── META-INF/ │ └── spring-configuration-metadata.json # 配置元数据 ├── pom.xml └── README.md

核心类说明

DmSchemaComparatorUtils

核心对比工具类,包含:

  • compareSchemas(): 对比两个数据库的表结构
  • generateSyncDDL(): 生成同步DDL脚本
  • getTableInfo(): 获取表的详细信息
  • isColumnEqual(): 判断列是否相等

DatabaseCompareConfig

配置类,使用@ConfigurationProperties自动绑定配置文件。

常见问题

Q: 为什么表名查询不到列信息?

A: 可能是表名大小写问题。程序会保持表名原始大小写,确保URL中的schema参数正确。

Q: 生成的DDL为什么包含相同定义的修改语句?

A: 程序会在生成DDL时进行二次检查,过滤掉实际定义相同的字段。如果仍有问题,请检查调试输出。

Q: 如何自定义输出文件路径?

A: 在application.yml中修改database.compare.output.file配置项。

开发计划

  • 支持索引对比
  • 支持主键/外键对比
  • 支持视图对比
  • 支持存储过程对比
  • 支持表数据对比
  • Web界面支持

更新日志

v0.0.1 (2024-12-19)

  • ✨ 初始版本发布
  • ✨ 支持表结构对比
  • ✨ 支持DDL脚本生成
  • ✨ 支持配置外部化
  • ✨ 支持IDE智能提示

About

DM-Compare 是一个基于 Spring Boot 的达梦数据库表结构对比工具,能够自动对比两个达梦数据库的表结构差异,并生成同步DDL脚本。

Language
Java100%