|
|
@@ -0,0 +1,91 @@
|
|
|
+# 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` 表中的失败记录。
|
|
|
+
|