架构与数据库 · 更新于 2026-10-27

数据库初始化与 Flyway 演进

详解 CatCRM 基于 Flyway 的自动化数据库建表机制、版本脚本规范与文件存储配置。

零手工 SQL 自动初始化

CatCRM 内置 Flyway 数据库版本管理引擎。无论是本地开发还是 Docker 容器首次启动,都不需要手工执行任何 SQL 脚本,应用启动时会自动完成建表与初始种子数据写入,保证开发、测试与生产环境严格一致。

  • 脚本存放目录:backend/src/main/resources/db/migration
  • 脚本命名规则:V{版本号}__{描述}.sql,版本号唯一且递增,例如新增表结构变更可使用 V7__add_contract_signer.sql

内置迁移脚本说明

版本脚本文件名核心内容说明
V1V1__init_schema.sql初始化全部 33 张表结构:包含 17 张 sys_ 系统基础表 + 16 张 crm_ 核心业务表
V2V2__init_data.sql写入初始化数据:系统参数配置、数据字典、权限菜单、默认管理员账号、CRM 动态字段元数据,并重置自增序列
V3V3__init_region_data.sql写入全国省市区行政区划基础数据(共 3217 条),并重置行政区划序列

空库与存量库兼容策略

  • 全新空库:首次启动时按 V1 -> V2 -> V3 顺序自动执行,数秒内即可得到完整表结构与初始业务数据。
  • 存量数据库(已手工建表):首次启动时会自动打基线(baseline)到版本 3,不会重复执行 V1~V3 建表,此后仅按序执行新增版本脚本(如 V4、V5)。
  • 人工接管模式:如生产环境有严格的 DBA 审批要求、需要人工执行脚本,只需在配置中设置 spring.flyway.enabled=false,再按版本顺序手工执行 SQL。

重要铁律:禁止修改已发布脚本

警告:已执行过的 Flyway 脚本严禁修改内容!Flyway 在每次启动时会校验已执行脚本的 Checksum(校验和),任何字符改动都会触发 Migration checksum mismatch 导致应用启动失败。任何表结构或数据变更,请一律新增递增版本脚本。

如果在开发环境中因调试改动了历史脚本导致报错:

  • 开发测试库:直接执行 DROP DATABASE catcrm; CREATE DATABASE catcrm; 重建即可。
  • 需保留数据的环境:使用 Flyway CLI 执行 flyway repair 重新计算并修复校验和。

本地文件存储配置说明

V2__init_data.sql 种子数据中的 STORAGE_CONFIG 默认配置为本地存储(type=0,路径 upload,按进程工作目录解析):

  • Docker 容器内:容器 WORKDIR=/app → 上传的图片与合同附件自动保存在 /app/upload(对应宿主机挂载的 ~/catcrm/upload)。
  • 本地开发启动:在 backend/ 工作目录启动 → 文件保存在 backend/upload。