Table Define 生成
WARNING
考虑到实现成本,本项目暂时放弃对非多对多中间表、复合主外键、非结构化映射等特性的支持。
TableAssociationsView
表生成的基础是 TableAssociationsView 这个 DTO。
以下为简化的形状表示:
GenTableAssociationsView {
schema {
dataSource
}
columns
indexes
inAssociations {
sourceTable
columnReferences {
sourceColumn
targetColumnId
}
}
outAssociations {
targetTable
columnReferences {
sourceColumnId
targetColumn
}
}
}
完整定义请参考 DTO 文件。
此处具有全部用于生成表定义的信息。
表定义
生成 TableDefine 本质即将 Table 信息翻译成 DDL 字符串。
Builder 内置了各种字符串化方法,在此基础上进行扩展相对容易。
列类型
每种数据库在类型设计上或多或少都有相当程度的差异,本项目的类型系统标准采用 JdbcType
。
通过精确控制 JdbcType
在该数据源中对参数的要求可以满足一些简单的类型翻译,而更详细的处理需要结合以下三个层级一同完成。
GenTypeMapping
:类型映射实体。将表转换为实体时,将特定数据源下特定类型翻译为特定属性类型。GenColumnDefault
:列默认实体。在模型设计时,特定数据源下列的默认模板。GenColumn.overwriteByRaw
:列本身的属性,以字面类型覆盖基于 Code 转换的默认类型。
标识符长度
数据源对标识符往往带有长度约束,为了避免超出长度限制,项目通过 IdentifierProcessor.kt 这一长度限制器进行规避。
Postgres 和 MySQL 长度限制均默认为 63,所以一般无需担心。
经过 IdentifierFilter 处理,过长的标识符将被修改为 <base name part> <md5 digest part>
,即将过长标识符的一定长度后的部分截去,替换为长度限制内的 MD5 加密后缀。
这个过程并不发生在导入阶段,而是发生在代码生成过程中,所以模型中的相关信息不会丢失。