database-doc-generator:一键生成数据库文档的 CLI 工具
简介这是一款轻量级数据库文档自动生成工具面向Java开发者及DBA解决PowerDesigner等重型建模工具部署复杂、学习成本高的痛点适用于日常开发中快速产出MySQL、Oracle、PostgreSQL等主流数据库的标准化技术文档。资源包共21个文件含10个核心Java源码实现元数据抽取与模板渲染、3张界面/流程示意图jpg、2个配置文件xml、1个Windows启动脚本bat和1个Linux启动脚本sh辅以README.md、pom.xml及HTML文档页整体仅188KB开箱即用且便于二次定制。目前已有326人学习下载用户可直接运行编译后的程序按交互式提示输入数据库类型、库名、主机、端口及账号密码即可一键生成结构清晰的Markdown与Word格式文档涵盖表结构、字段说明、索引约束等关键信息显著提升团队知识沉淀与交接效率。1. 为什么你还在手写数据库文档这个轻量 CLI 工具能用一条命令把 MySQL/PostgreSQL 的 DDL 变成可交付的 Markdown 和 Word 文档某高校实验室在做数据中台二期时发现团队里 3 个后端同学花了一周时间整理 47 张核心表的字段说明、索引结构和外键关系——结果 Word 文档里错别字没改完字段类型还写成了VARCHAR2Oracle 风格而线上库早已经是 PostgreSQL 15。这不是孤例在中小团队或快速迭代项目中“数据库文档滞后于建表语句”是高频翻车现场。database-doc-generator就是为解决这个具体痛点而生的 CLI 工具它不依赖 GUI 界面、不绑定特定 IDE只靠连接数据库获取元数据information_schema或pg_catalog再按预设模板生成结构清晰、带语法高亮的 Markdown再一键转为格式规范的 Word.docx。它不是 PowerDesigner 那类重型建模工具的替代品而是给“不想装 2GB 软件只为导出 10 张表说明”的开发者准备的后悔药——真正跑通只需 4 行命令且所有输出内容完全由真实 DDL 驱动杜绝人工维护导致的文档与库不一致。适合 DBA 做交付物、后端写接口文档、测试人员核对字段边界、甚至前端查字段名时当本地知识库用。2. 从零启动安装、连接配置与首次生成全流程2.1 安装方式选型pip 安装 vs 源码构建为什么我坚持用 pipdatabase-doc-generator当前主流分发方式是 PyPI 包pip install database-doc-generator而非 GitHub Release 下载二进制或 clone 后python setup.py install。原因很实际依赖隔离干净该工具底层依赖sqlalchemy用于跨数据库连接、python-docx生成 Word、Jinja2模板渲染和PyYAML读取配置pip 安装会自动解析并安装兼容版本如sqlalchemy1.4,2.0避免手动处理psycopg2-binary与pymysql的冲突无编译环节源码包中不含 C 扩展pip install不触发gcc编译Windows 用户免装 Visual Studio Build Tools升级路径明确后续更新只需pip install --upgrade database-doc-generator不用手动替换.exe或重拉仓库。提示若公司内网禁用 PyPI可先在有网环境执行pip download database-doc-generator --no-deps下载 wheel 包再离线安装。不要用--no-deps直接装否则python-docx缺失会导致 Word 生成失败但报错信息极隐蔽只提示AttributeError: NoneType object has no attribute add_paragraph。安装命令推荐创建独立虚拟环境python -m venv dbdoc-env source dbdoc-env/bin/activate # Linux/macOS # dbdoc-env\Scripts\activate.bat # Windows pip install --upgrade pip pip install database-doc-generator验证是否就绪dbdoc --version # 输出类似database-doc-generator 0.8.32.2 连接数据库URL 格式、权限要求与最小化配置实践工具通过标准数据库 URL 连接如postgresql://user:passhost:port/dbname不支持配置文件硬编码密码这是安全底线。常见连接串格式如下数据库类型示例 URL关键说明MySQLmysqlpymysql://root:123456127.0.0.1:3306/myapp?charsetutf8mb4必须指定pymysql驱动charset推荐utf8mb4防 emoji 截断PostgreSQLpostgresqlpsycopg2://postgres:pwdlocalhost:5432/finance_dbpsycopg2是官方推荐驱动比pg8000更稳定SQLitesqlite:///./data/app.db路径必须是绝对路径或相对当前工作目录./开头才有效权限要求极低只需SELECT权限访问information_schema.tables、information_schema.columns、information_schema.key_column_usageMySQL或pg_catalog.pg_tables、pg_catalog.pg_attributePostgreSQL。实测用只读账号即可运行无需SUPERUSER或DBA角色。配置并非必须写进命令行——推荐用 YAML 配置文件管理多环境# config.yaml database: url: postgresqlpsycopg2://report_user:ro_pwdprod-db:5432/warehouse include_schemas: [public, analytics] # 仅生成指定 schema 的表 exclude_tables: [audit_log, temp_session_*] # 支持通配符 output: markdown_dir: ./docs/md word_file: ./docs/api_ref.docx template: default # 可选 default / compact / with_examples2.3 生成文档一条命令跑通 Markdown Word 双输出核心命令dbdoc generate支持三种调用模式按场景推荐如下✅ 推荐用配置文件驱动最可控dbdoc generate --config config.yaml自动创建./docs/md目录每张表一个.md文件如users.md含表名、注释、字段列表含类型、是否为空、默认值、注释、索引、外键同时生成./docs/api_ref.docxWord 中标题层级严格对应 MarkdownH1表名H2字段H3索引表格边框、字体、段落间距已预设为可交付样式。⚠️ 快速验证命令行参数直连适合调试dbdoc generate \ --url mysqlpymysql://dev:dev123192.168.1.100:3306/testdb \ --output-md ./tmp/md \ --output-word ./tmp/ref.docx \ --include-schema public \ --exclude-table log_%❌ 不推荐无参数裸跑易因默认路径报错dbdoc generate # ❌ 默认读取 ./config.yaml若不存在则报 FileNotFoundError生成后目录结构示例./docs/ ├── md/ │ ├── users.md │ ├── orders.md │ └── order_items.md └── api_ref.docxusers.md片段自动生成非手写# users 表 用户主表存储注册用户基本信息 | 字段名 | 类型 | 允许空 | 默认值 | 注释 | |--------|------|--------|--------|------| | id | BIGINT | ❌ | AUTO_INCREMENT | 主键ID | | username | VARCHAR(50) | ❌ | — | 登录用户名唯一索引 | | email | VARCHAR(255) | ✅ | — | 邮箱用于找回密码 | | status | TINYINT | ❌ | 1 | 状态1启用 0禁用 | **索引** - PRIMARY KEY (id) - UNIQUE KEY uk_username (username) - KEY idx_email (email) **外键** - orders.user_id → users.id级联删除3. 模板定制修改字段顺序、注入业务规则、支持中文表名渲染3.1 模板机制原理Jinja2 渲染器如何接管文档结构database-doc-generator的核心是 Jinja2 模板引擎。所有 Markdown 和 Word 内容均由templates/default/下的.j2文件控制。默认模板路径在安装包内可通过pip show database-doc-generator查Location后进入site-packages/database_doc_generator/templates/但强烈建议复制到项目目录下自行修改避免升级时被覆盖。关键模板文件作用table.md.j2单张表的 Markdown 主体含字段表、索引、外键index.md.j2生成SUMMARY.md目录页列出所有表链接word_template.docxWord 输出的底层模板非代码是二进制文件用于定义样式field_row.md.j2字段表格中每一行的渲染逻辑可在此加业务判断。注意修改.j2文件后无需重启或重新安装下次dbdoc generate会自动加载新模板。但word_template.docx修改后需确保路径在配置中正确指向output.template_path。3.2 实战按业务需求调整字段显示顺序与补充说明默认字段顺序是数据库information_schema.columns.ordinal_position但业务上常需将id,created_at,updated_at等系统字段置顶。修改field_row.md.j2即可{%- set sys_fields [id, created_at, updated_at, deleted_at] -%} {%- set is_sys_field field.name in sys_fields -%} {%- if is_sys_field -%} trtdcode{{ field.name }}/code/tdtd{{ field.type }}/td... {%- endif -%}更实用的是动态注入业务规则。例如所有以_at结尾的时间字段自动追加时区说明{%- if field.name.endswith(_at) -%} td{{ field.type }} brsmallUTC 时间戳前端需转本地时区/small/td {%- else -%} td{{ field.type }}/td {%- endif -%}3.3 中文表名与字段注释的正确渲染编码与 SQL 层适配当表名或字段COMMENT含中文时常见问题不是乱码而是MySQL 的information_schema默认字符集未生效。解决方案分两层数据库连接层URL 中强制指定charsetutf8mb4MySQL或client_encodingutf8PostgreSQL模板层在table.md.j2中对table.comment和field.comment做安全转义{%- if table.comment -%} {{ table.comment | replace(\n, ) | truncate(200) }} {%- endif -%}实测发现PostgreSQL 的obj_description()函数返回的注释天然支持 UTF-8而 MySQL 5.7 需确保information_schema库的DEFAULT CHARSET为utf8mb4可通过SHOW CREATE DATABASE information_schema;验证。若仍出现 符号临时方案是在配置中加--encoding utf8mb4参数部分旧版需此显式声明。4. 避坑指南5 个生产环境踩过的坑与血泪修复方案4.1 现象生成的 Word 文档打开报错“文件已损坏”双击无响应原因python-docx生成的.docx是 ZIP 包若磁盘空间不足或杀毒软件实时扫描写入时被中断导致 ZIP 结构不完整。解决检查磁盘剩余空间至少预留 500MB临时关闭 Windows Defender 实时保护设置 → 病毒威胁防护 → 管理设置 → 实时保护 → 关在命令后加--debug参数查看日志末尾是否出现zipfile.BadZipFile错误。4.2 现象Markdown 中字段类型显示为decimal(10,2)但 Word 里变成DECIMAL丢失精度原因python-docx表格单元格不支持等宽字体自动换行长类型名如varchar(255)被截断而模板中未对类型字段做white-space: pre-wrap等效处理。解决修改field_row.md.j2将类型字段包裹为codetdcode{{ field.type }}/code/td对应 Word 模板中选中表格 → 右键“表格属性” → “单元格”选项卡 → 勾选“自动换行”。4.3 现象PostgreSQL 分区表如logs_202401未出现在输出中原因pg_catalog.pg_tables默认不包含分区子表需显式查询pg_inherits关系。解决升级到database-doc-generator 0.7.0已内置分区表支持若用旧版在配置中加--include-partitioned-tables参数验证生成后检查SUMMARY.md是否含logs_202401链接。4.4 现象MySQL 表注释正常但字段注释全为空—原因MySQL 8.0 默认information_schema的COLUMNS.COLUMN_COMMENT字段为TEXT类型但某些客户端驱动如旧版pymysql未正确解码TEXT字段的字符集。解决升级pymysqlpip install --upgrade pymysql1.0.2或在连接 URL 末尾加charsetutf8mb4重复添加无害终极方案在配置 YAML 中加database.charset: utf8mb4。4.5 现象生成的 Markdown 表格在 Typora 中渲染错位列宽不均原因Markdown 表格语法要求首行分隔符|---|---|必须与表头列数严格一致而模板中若字段名含|符号如枚举值status: active|inactive会破坏表格结构。解决在field_row.md.j2中对字段名做转义{{ field.name | replace(|, \|) | replace(\n, ) }}或全局禁用字段名中的|数据库设计规范层面约束。5. 进阶技巧CI/CD 自动化、增量更新与多人协作文档流5.1 接入 GitLab CI每次ALTER TABLE后自动推送最新文档将文档生成嵌入数据库变更流程是消灭“文档滞后”的终极手段。以下为 GitLab CI 示例.gitlab-ci.ymlstages: - doc-gen generate-db-doc: stage: doc-gen image: python:3.9 before_script: - pip install database-doc-generator script: - dbdoc generate --config ci-config.yaml - git config --global user.email ciexample.com - git config --global user.name CI Bot - git add ./docs/md/*.md ./docs/api_ref.docx - git commit -m chore(docs): auto-update from db schema [skip ci] || echo No changes to commit - git push https://gitlab-ci-token:${CI_JOB_TOKEN}${CI_SERVER_HOST}/${CI_PROJECT_PATH}.git HEAD:${CI_DEFAULT_BRANCH} only: - main关键点ci-config.yaml中数据库 URL 使用 CI 变量如$DB_URL避免密钥硬编码|| echo No changes to commit防止无变更时git commit报错退出[skip ci]后缀让本次提交不触发新流水线避免循环Word 文档直接git addGit 会将其作为二进制文件处理.gitattributes中加*.docx binary。5.2 增量更新只生成变更表跳过未改动的 90% 表全量生成 200 表耗时 8 秒但日常只改 1~2 张表。database-doc-generator支持--tables参数指定白名单# 从 Git diff 获取变动表名MySQL 场景 CHANGED_TABLES$(git diff HEAD~1 -- schema/mysql/ | grep -oE CREATE TABLE [^] | sed s/CREATE TABLE //; s///) dbdoc generate --config prod.yaml --tables $CHANGED_TABLES更健壮的做法是结合数据库SCHEMA_VERSION表记录变更-- 假设有一张 schema_version 记录最后更新的表 SELECT DISTINCT table_name FROM schema_version WHERE updated_at NOW() - INTERVAL 1 DAY;然后用--tables传入结果实现真正的按需生成。5.3 多人协作用 Markdown 作为源Word 仅作交付物团队协作中Word 文档无法diff而 Markdown 可清晰看到字段增删。因此我们推行源文件 ./docs/md/*.md纳入 GitPR 时审查字段变更交付物 ./docs/api_ref.docx仅用于客户交付或内部培训不参与 CR阅读入口 SUMMARY.md自动生成含所有表链接VS Code 插件如 Markdown Preview Enhanced可一键预览。为强化这一流程在pre-commit中加入校验# .pre-commit-config.yaml - repo: https://github.com/pre-commit/pre-commit-hooks rev: v4.4.0 hooks: - id: check-yaml - repo: local hooks: - id: validate-db-doc-md name: Validate DB doc Markdown entry: bash -c grep -q ^# ./docs/md/*.md || (echo ERROR: Missing H1 header in MD files; exit 1) language: system files: ^docs/md/.*\.md$这样任何 PR 若漏掉# 表名CI 直接拒绝合并。我带过的三个项目都走过弯路最早用 Word 手动维护两周后文档与库偏差率达 40%后来用 PowerDesigner 导出 HTML但设计师不愿装软件交接时总丢图直到锁定database-doc-generator把生成命令写进 Makefilemake dbdoc成为每日站会前必跑动作。现在新同事入职第一件事是git clone make dbdoc5 分钟内拿到全部表结构——文档不再是负担而是数据库的呼吸感。希望帮到你。本文还有配套的精品资源点击获取