DIP1 工作日志 — Migration / Seed / /ready 验证
DWLG 编号:DWLG-20260809-04
日期:2026-08-09(实际执行至 2026-08-10 00:23)
参与方:DIP1 Code Agent
关联文档:DIP1-SCH(DOC-D01-DB V2.0)、DIP1-P3(DOC-D01-D3 V1.1)、DIP1-IMP(DOC-D01-IMP V2.0 §7.1)
一、工作内容
- 修复 Alembic 双向迁移:
0001_initial_schema.py downgrade 使用 DROP TABLE ... CASCADE 处理 cpt_orders <-> ops_leads 等循环外键依赖;
- 显式
DROP TYPE IF EXISTS 清理 sa.Enum(..., create_type=True) 创建的枚举类型,避免 upgrade -> downgrade -> upgrade 二周目失败。
- 修复
0002_cst_mobile_push.py downgrade 同样使用 CASCADE 删表,并补充 4 个 create_type=True 枚举类型的删除。
- 修复 Seed CLI 运行问题:
SysRole.role_id、SysRolePermission.role_id ORM 模型字段从 String(16) 改为 ENUM(..., name="app_enum__sys_role_6"),与数据库类型对齐;
MdsSclCategory.category_id 补充 server_default=text("app_gen_ulid('CAT')") 消除 SQLAlchemy 警告;
- Seed CLI 输出去掉 emoji,避免 Windows Git Bash GBK 编码报错。
- 创建本地
.env 开发配置。
- 验证:
alembic upgrade head && alembic downgrade base && alembic upgrade head 三遍循环通过;
python -m app.infrastructure.db.seed.cli 成功写入角色、权限、管理员、SCL 品类种子数据;
- 启动 FastAPI 后
GET /ready 返回 {"ready":true,"checks":{"db":"ok"}}。
二、产出物
| 类型 |
路径 |
说明 |
| 代码 |
backend/alembic/versions/0001_initial_schema.py |
downgrade 使用 CASCADE + 显式删 TYPE |
| 代码 |
backend/alembic/versions/0002_cst_mobile_push.py |
同上,补充 4 个枚举类型删除 |
| 代码 |
backend/app/infrastructure/db/models/sys.py |
role_id 改为 ENUM 对齐数据库 |
| 代码 |
backend/app/infrastructure/db/models/mds.py |
category_id 补充 ULID server_default |
| 代码 |
backend/app/infrastructure/db/seed/cli.py |
输出改为 ASCII,避免编码异常 |
| 配置 |
.env |
本地开发环境变量 |
三、关键决策
- 使用
DROP TABLE ... CASCADE 而不是手动排序删表:0001/0002 表间存在 cpt_orders <-> ops_leads 等双向外键,人工维护 drop 顺序脆弱;CASCADE 由 PostgreSQL 自动解除依赖,可逆且健壮。
- 枚举类型显式删除:SQLAlchemy
create_type=True 在 raw DROP TABLE CASCADE 场景下不会自动回收 TYPE,必须在 downgrade 末尾逐个 DROP TYPE IF EXISTS。
四、问题与待办
| # |
问题 |
状态 |
负责人 |
截止 |
| 1 |
Windows Git Bash 下 Python 输出中文需 PYTHONIOENCODING=utf-8 |
🟢 已 workaround |
Code Agent |
— |
| 2 |
模型与迁移的枚举字段未完全对齐,后续新增 ORM 操作需逐表复核 |
🟡 持续 |
Code Agent |
— |
五、状态矩阵更新(DIP1-IMP §7.1)
- C-D1(Alembic 迁移 / 22 表 / 30 枚举 / RLS):🟡 → 🟢 —
upgrade/downgrade/upgrade 循环通过
- C-D2(Seed 数据 / 角色权限 / SCL 品类):🟡 → 🟢 — Seed CLI 可重复执行,数据写入正常
- C-B0(后端服务可启动 / /ready):🟡 → 🟢 —
/ready 返回 DB ok