--- name: entity-db-sync description: 确保Java实体类与数据库SQL脚本同步的技能,当修改实体类字段时自动检查并更新对应的数据库初始化脚本,保证表结构与实体定义严格一致。使用场景:修改实体类属性、添加字段、删除字段、字段类型变更时自动触发。实践要求:同步更新设计文档中的数据表信息,独立目录保存变更脚本便于生产环境更新。 --- # 实体类与数据库脚本同步技能 ## 触发条件 当出现以下情况时自动应用此技能: 1. **实体类修改相关**: - 修改Java实体类的字段定义 - 添加新的实体类字段 - 删除实体类字段 - 修改字段的数据类型或注解 2. **数据库脚本相关**: - 需要更新数据库初始化SQL脚本 - 需要创建新的表结构SQL - 需要修改现有表的字段定义 3. **同步检查相关**: - 需要验证实体类与数据库脚本的一致性 - 需要生成差异报告 - 需要修复不一致的地方 4. **文档维护相关**: - 需要同步更新设计文档中的表结构信息 - 需要生成数据库变更脚本 - 需要维护生产环境更新包 ## 核心原则 ### 同步规范 - **一对一映射**:每个实体类字段必须对应数据库表中的列 - **类型匹配**:Java数据类型与MySQL数据类型必须兼容 - **约束一致**:非空约束、长度限制等必须保持一致 - **注解驱动**:基于JPA/Hibernate注解生成SQL定义 ### 文档同步规范 - **设计文档更新**:实体类变更时同步更新相关设计文档 - **变更脚本管理**:独立目录保存数据库变更脚本 - **版本控制**:维护清晰的变更历史和版本信息 ### 生产环境部署规范 - **变更脚本独立存储**:便于生产环境按需执行 - **回滚方案准备**:每个变更都提供回滚脚本 - **影响评估**:评估变更对现有数据的影响 ## 实践要求 ### 1. 设计文档同步更新 #### 需要维护的文档类型 - **数据库设计文档**:表结构定义、字段说明、约束条件 - **API接口文档**:涉及数据模型变更的接口说明 - **业务流程文档**:受数据结构影响的业务逻辑说明 #### 文档更新流程 ``` 1. 实体类修改 → 2. 生成SQL变更脚本 → 3. 更新设计文档 → 4. 验证一致性 ``` #### 文档更新检查清单 - [ ] 数据库表结构调整说明 - [ ] 字段新增/删除/修改记录 - [ ] 约束条件变更说明 - [ ] 索引变更记录 - [ ] 业务影响评估 ### 2. 变更脚本管理 #### 目录结构规范 ``` project/ ├── change/ # 部署相关文件(与开发代码分离) │ └── sql/ │ ├── init/ # 初始化脚本(首次部署) │ │ ├── user.sql │ │ ├── order.sql │ │ └── product.sql │ └── upgrade/ # 升级脚本(版本变更) │ ├── v1.1.0/ │ │ ├── 20240115_add_user_phone.sql │ │ ├── 20240115_modify_order_amount_precision.sql │ │ └── rollback/ │ │ ├── 20240115_add_user_phone_rollback.sql │ └── v1.2.0/ │ └── 20240201_add_product_category.sql └── src/main/resources/ # 开发代码目录(保持独立) ``` #### 变更脚本命名规范 ```bash # 格式:YYYYMMDD_description.sql 20240115_add_user_phone.sql # 正向变更 20240115_add_user_phone_rollback.sql # 回滚脚本 20240115_add_user_phone_verify.sql # 验证脚本 ``` #### 脚本内容模板 ```sql -- ============================================ -- 变更描述: 为用户表添加手机号字段 -- 变更时间: 2024-01-15 -- 影响版本: v1.1.0 -- 影响表: user -- ============================================ -- 1. 添加字段 ALTER TABLE `user` ADD COLUMN `phone` VARCHAR(20) COMMENT '手机号码'; -- 2. 添加索引 ALTER TABLE `user` ADD INDEX `idx_phone` (`phone`); -- 3. 更新现有数据(如有必要) UPDATE `user` SET `phone` = '' WHERE `phone` IS NULL; -- 4. 验证变更 SELECT COUNT(*) as phone_count FROM `user` WHERE `phone` IS NOT NULL; ``` #### 回滚脚本模板 ```sql -- ============================================ -- 回滚描述: 撤销用户表手机号字段添加 -- 回滚时间: 20240115 -- 原变更: 20240115_add_user_phone.sql -- ============================================ -- 1. 删除索引 ALTER TABLE `user` DROP INDEX `idx_phone`; -- 2. 删除字段 ALTER TABLE `user` DROP COLUMN `phone`; -- 3. 验证回滚 SELECT COUNT(*) as remaining_indexes FROM information_schema.STATISTICS WHERE TABLE_NAME = 'user' AND COLUMN_NAME = 'phone'; ``` ## 工作流程 ### 完整同步流程 ``` 1. 实体类修改 ↓ 2. 生成差异报告 ↓ 3. 编写变更脚本 ↓ 4. 更新初始化脚本 ↓ 5. 同步设计文档 ↓ 6. 验证一致性 ↓ 7. 提交变更包 ``` ### 自动化工具集成 #### 变更脚本生成器 ```python # generate-change-script.py import datetime import os def create_change_script(table_name, changes, version): """生成标准变更脚本""" today = datetime.date.today().strftime('%Y%m%d') timestamp = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S') # 部署目录结构 change_dir = "change/sql/upgrade" version_dir = f"{change_dir}/{version}" rollback_dir = f"{version_dir}/rollback" # 创建目录 os.makedirs(version_dir, exist_ok=True) os.makedirs(rollback_dir, exist_ok=True) script_content = f"""-- ============================================ -- 变更描述: {changes['description']} -- 变更时间: {timestamp} -- 影响版本: {version} -- 影响表: {table_name} -- ============================================ """ # 添加具体的SQL变更 for change_type, change_detail in changes.items(): if change_type == 'add_columns': for column in change_detail: script_content += f"ALTER TABLE `{table_name}` ADD COLUMN {column};\n" elif change_type == 'modify_columns': for column in change_detail: script_content += f"ALTER TABLE `{table_name}` MODIFY COLUMN {column};\n" # 保存脚本 filename = f"{today}_{changes['description'].replace(' ', '_').lower()}.sql" filepath = f"{version_dir}/{filename}" with open(filepath, 'w', encoding='utf-8') as f: f.write(script_content) return filepath ``` #### 文档同步检查器 ```bash #!/bin/bash # sync-documentation.sh ENTITY_FILE=$1 CHANGE_SCRIPT=$2 echo "=== 同步设计文档 ===" # 提取变更信息 TABLE_NAME=$(grep -o '@Table(name = "[^"]*")' "$ENTITY_FILE" | cut -d'"' -f2) CHANGE_DESC=$(basename "$CHANGE_SCRIPT" .sql | cut -d'_' -f2-) # 更新数据库设计文档到change目录 echo "更新数据库设计文档..." DOC_DIR="change/docs/database" mkdir -p "$DOC_DIR" # 生成变更说明文档 cat > "${DOC_DIR}/${TABLE_NAME}_change_${CHANGE_DESC}.md" << EOF # ${TABLE_NAME} 表结构变更说明 ## 变更概述 - 变更时间: $(date '+%Y-%m-%d') - 变更类型: 字段添加/修改/删除 - 影响范围: ${TABLE_NAME} 表 ## 详细变更 $(cat "$CHANGE_SCRIPT") ## 业务影响 - [ ] API接口适配 - [ ] 前端页面调整 - [ ] 数据迁移需求 - [ ] 测试用例更新 ## 验证清单 - [ ] 开发环境验证 - [ ] 测试环境验证 - [ ] 生产环境预演 EOF echo "文档同步完成: ${DOC_DIR}/${TABLE_NAME}_change_${CHANGE_DESC}.md" ``` ## 最佳实践 ### 1. 变更管理 ``` 版本分支 → 开发变更 → 生成脚本 → 文档同步 → 测试验证 → 合并发布 ``` ### 2. 生产环境部署 ```bash # 生产环境变更部署流程 1. 备份数据库 2. 执行变更脚本 3. 验证数据一致性 4. 功能测试 5. 监控观察 6. 准备回滚方案 ``` ### 3. 团队协作规范 - 实体类修改必须附带变更脚本 - 变更前必须进行影响评估 - 多人协作时建立变更协调机制 - 定期审查变更历史和文档同步情况 这个增强版的技能不仅确保实体类与数据库脚本的技术同步,还建立了完整的文档维护和生产环境变更管理流程。