笔者之前被数仓部门要求提供本部门系统的表结构文档,尝试过workbench、Navicat、小海豚等客户端工具,发现很难满足需求,有一个脚本可以查询每一个表的结构,数据库表不多还可以一个一个查,如果一个系统表达到几百个的时候可能就没有心情一个个去Ctrl+c Ctrl+v了。
一、单表结构查询
SELECT
TABLE_SCHEMA AS '库名',
TABLE_NAME AS '表名',
COLUMN_NAME AS '列名',
ORDINAL_POSITION AS '列的排列顺序',
COLUMN_DEFAULT AS '默认值',
IS_NULLABLE AS '是否为空',
DATA_TYPE AS '数据类型',
CHARACTER_MAXIMUM_LENGTH AS '字符最大长度',
NUMERIC_PRECISION AS '数值精度(最大位数)',
NUMERIC_SCALE AS '小数精度',
COLUMN_TYPE AS '列类型',
COLUMN_KEY 'KEY',
EXTRA AS '额外说明',
COLUMN_COMMENT AS '注释'
FROM
information_schema.COLUMNS
WHERE
TABLE_SCHEMA = 'scf'
and TABLE_NAME = 'act_evt_log'
ORDER BY
TABLE_NAME,
ORDINAL_POSITION;
执行结果如图可以看出来效果不是很好。
单个表结构示例二、通过自定义脚本方式导出文件
2.1 在idea中创建一个maven项目导入相关依赖
<dependency>
<groupId>cn.smallbun.screw</groupId>
<artifactId>screw-core</artifactId>
<version>1.0.5</version>
</dependency>
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
<version>3.4.5</version>
</dependency>
2.2 编写测试类和main方法
public class ExportDBStruct {
public static void main(String[] args) {
documentGeneration();
}
/**
* 文档生成
*/
public static void documentGeneration() {
//数据源
HikariConfig hikariConfig = new HikariConfig();
hikariConfig.setDriverClassName("com.mysql.jdbc.Driver");
hikariConfig.setJdbcUrl("jdbc:mysql://127.0.0.1:3306/scf?characterEncoding=UTF-8&useSSL=false&useUnicode=true&serverTimezone=GMT%2b8");
hikariConfig.setUsername("root");
hikariConfig.setPassword("123456");
//设置可以获取tables remarks信息
hikariConfig.addDataSourceProperty("useInformationSchema", "true");
hikariConfig.setMinimumIdle(2);
hikariConfig.setMaximumPoolSize(5);
DataSource dataSource = new HikariDataSource(hikariConfig);
//生成配置
EngineConfig engineConfig = EngineConfig.builder()
//生成文件路径
.fileOutputDir("D:/test/")
//打开目录
.openOutputDir(true)
//文件类型可以选择HTML、MD、WORLD
.fileType(EngineFileType.HTML)
//生成模板实现
.produceType(EngineTemplateType.freemarker)
//自定义文件名称
.fileName("XXX业务表结构").build();
// 注释部分需要根据实际需求过滤哪些表
// //忽略表
// ArrayList<String> ignoreTableName = new ArrayList<>();
// ignoreTableName.add("test_user");
// ignoreTableName.add("test_group");
// //根据表前缀生成
// ArrayList<String> preTableName = new ArrayList<>();
// preTableName.add("biz_");
// //根据指定表生成
// ArrayList<String> designTableName = new ArrayList<>();
// designTableName.add("base_ddct");
//忽略表前缀
// ArrayList<String> ignorePrefix = new ArrayList<>();
// ignorePrefix.add("test_");
// //忽略表后缀
// ArrayList<String> ignoreSuffix = new ArrayList<>();
// ignoreSuffix.add("_test");
ProcessConfig processConfig = ProcessConfig.builder().build();
//指定生成逻辑、当存在指定表、指定表前缀、指定表后缀时,将生成指定表,其余表不生成、并跳过忽略表配置
//根据名称指定表生成
// .designatedTableName(designTableName)
// //根据表前缀生成
// .designatedTablePrefix(preTableName).build();
// //根据表后缀生成
// .designatedTableSuffix(new ArrayList<>())
// //忽略表名
// .ignoreTableName(ignoreTableName)
// //忽略表前缀
// .ignoreTablePrefix(ignorePrefix)
// //忽略表后缀
// .ignoreTableSuffix(ignoreSuffix).build();
//配置
Configuration config = Configuration.builder()
//版本
.version("1.0.0")
//描述
.description("VCF数据库设计文档生成")
//数据源
.dataSource(dataSource)
//生成配置
.engineConfig(engineConfig)
//生成配置
.produceConfig(processConfig)
.build();
//执行生成
new DocumentationExecute(config).execute();
}
}
2.3 执行main方法后在指定保存的目录查看生成的文档。
生成对应的HTML文档 文档第一个表格为目录2.4 点击红框内的表名跳转到该表结构的明细
业务表字段明细
网友评论