# AI 开发规范:数据库变更指南 (Database Migration Guide) ## 1. 核心原则 (Core Principles) 本项目的数据库管理采用 **"Schema as Code"** 模式,由 **Flyway** 和 **SQLAlchemy** 共同管理。 AI 在执行任何涉及数据库结构(Schema)的变更时,**必须**严格遵循以下流程。 **🚫 禁止行为:** 1. **禁止** 直接告诉用户去数据库执行 SQL 语句。 2. **禁止** 仅修改 Python `models` 代码而不创建 SQL 迁移脚本(这会导致代码与数据库不一致)。 3. **禁止** 修改已经存在的/旧的 `V` 开头的 SQL 文件(历史记录不可篡改)。 --- ## 2. 变更流程 (Workflow) 当用户提出需求(如:“给用户表加一个手机号字段”)时,AI 需按顺序执行以下步骤: ### 第一步:确定版本号 1. 扫描项目根目录下的 `sql/` 文件夹。 2. 找到当前最大的版本号(例如当前是 `V4__xxx.sql`)。 3. 新文件的版本号 = 当前最大版本号 + 1(即 `V5`)。 ### 第二步:创建迁移脚本 (Migration Script) 在 `sql/` 目录下创建新文件。 * **命名规则**:`V{Version}__{Description}.sql` * 注意:`V` 大写。 * 注意:版本号与描述之间是 **双下划线 (`__`)**。 * 示例:`sql/V2__add_phone_column.sql` * **内容规范**: * 使用标准 MySQL 8.0 语法。 * 尽量保证操作的可重入性(虽然 Flyway 会保证只执行一次,但写法上推荐防御性编程)。 ```sql -- 示例内容 ALTER TABLE users ADD COLUMN phone_number VARCHAR(20) DEFAULT NULL COMMENT '用户手机号'; -- 如果是创建表 CREATE TABLE IF NOT EXISTS new_table (...); ``` ### 第三步:同步 SQLAlchemy 模型 (Sync Models) 修改后端代码以匹配新的数据库结构。 * **目标路径**:`backend/app/models/` * **操作**:找到对应的 Python 模型文件(如 `user.py`),添加或修改对应的 `Column` 定义。 ```python # backend/app/models/user.py class User(Base): # ... 原有字段 phone_number = Column(String(20), nullable=True, comment="用户手机号") # 新增 ``` ### 第四步:同步 Pydantic Schema (Optional) 如果该字段需要通过 API 暴露或接收,需同步修改 Schema。 * **目标路径**:`backend/app/schemas/` * **操作**:在 `UserBase` 或 `UserCreate`/`UserUpdate` 模型中添加字段。 --- ## 3. 示例场景 (Example Scenario) **用户指令**: > "帮我增加一个功能,记录用户的最后登录IP。" **AI 应执行的操作**: 1. **读取文件列表**:检查 `sql/`,发现最新是 `V1__init.sql`。 2. **创建文件**:`sql/V2__add_last_login_ip.sql`。 ```sql ALTER TABLE users ADD COLUMN last_login_ip VARCHAR(50) DEFAULT NULL; ``` 3. **修改模型**:`backend/app/models/user.py`。 ```python last_login_ip = Column(String(50), nullable=True) ``` 4. **修改 Schema**:`backend/app/schemas/user.py` (视情况而定)。 5. **回复用户**: > "已为您创建了数据库迁移脚本 `V2` 并更新了后端模型。请执行 `docker-compose up -d` 以应用变更。" --- ## 4. 故障排查 (Troubleshooting) 如果 Flyway 启动失败(校验和错误): * **原因**:有人修改了已经执行过的 SQL 文件。 * **AI 建议**:不要尝试通过 AI 修复历史文件的 checksum。建议用户进入 `uap_migration` 容器手动运行 `flyway repair`,或者在开发环境中清理 `flyway_schema_history` 表中的失败记录。