# 数据库迁移 Agent 说明 ## 基本规则 - 数据库是 PostgreSQL;SQLModel 变更必须配套 Alembic 迁移。 - 迁移位于 `backend/alembic/versions/`。 - 文件名沿用三位编号加语义描述(存在 `009_0`、`009_1` 子编号形态);编号从现有迁移文件推导下一个可用值,不要假设固定值。 - 每个迁移必须: - 设置唯一 `revision`; - 把 `down_revision` 指向当前 head; - 提供 `upgrade()` 和可执行的 `downgrade()`; - 保持单线迁移链,不创建并行 head。 生成方式: ```bash cd backend uv run alembic revision --autogenerate -m "073 describe change" ``` autogenerate 只是草稿。必须人工检查: - 是否漏掉 xpack 或延迟导入模型的表; - 索引、约束、默认值、nullable、comment 是否完整; - 是否包含无关表或历史差异; - PostgreSQL 方言是否正确,尤其是 `JSONB`、`VECTOR` 和 `USING` 转换。 ## 结构迁移 - 新增非空列优先采用两步:先加 nullable 列并回填,再视需要收紧约束。 - 有默认值语义时明确 `server_default`,不要只依赖 Python 模型默认值。 - 修改类型时提供 PostgreSQL `USING` 表达式;参考 `071_modify_permission_jsonb.py`。 - 删除或重命名列先确认代码、导出、报表和 xpack 调用没有旧名残留。 - 不要在迁移里顺手重命名历史表或整理无关 schema。 ## 数据迁移 - 数据回填必须分批,避免长事务锁表。 - 先明确空值、重复值和非法历史值的默认策略。 - 不要在迁移中调用业务 CRUD;使用面向迁移的 SQL 或轻量对象。 - 涉及加密、embedding 或外部系统时,说明为什么迁移期可以安全执行。 - downgrade 若无法完整恢复数据,必须显式说明局限,不要伪装成无损回滚。 ## xpack schema - xpack 表结构变更属于跨仓库接口变更。 - 先确认主仓库将锁定的 xpack wheel 版本,并检查该版本中的模型。 - 不要把仅闭源功能需要的表混进开源功能迁移。 - 发布顺序遵循 `docs/agents/packaging.md`。 ## 验证 在有可用的一次性开发数据库前,不要默认执行迁移。至少执行: ```bash cd backend uv run alembic heads uv run alembic history ``` 确认只有一个 head 且新迁移的父节点正确。对一次性数据库执行 `upgrade head`,必要时再执行一级 downgrade 验证回滚。数据库结构变更要同步检查模型、CRUD、API schema、导出/导入和 xpack 调用。