Skip to content

[Bug][可维护性] Schema 迁移全部走启动时手写 SQL(ensure_knowledge_schema/ensure_business_schema),无版本化无回滚 #877

Description

@Alex-Fleet

标题: [Bug][可维护性] Schema 迁移全部走启动时手写 SQL(ensure_knowledge_schema/ensure_business_schema),无版本化无回滚

正文:

问题

backend/package/yuxi/storage/postgres/manager.py(约 122 行起)在服务启动时(api 的 lifespan 与 worker 启动流程)逐条执行上百条手写 DDL:

async def ensure_knowledge_schema(self):
    stmts = [
        "ALTER TABLE IF EXISTS knowledge_bases ADD COLUMN IF NOT EXISTS embedding_model_spec VARCHAR(512)",
        ...
        "DELETE FROM api_keys WHERE user_id IS NULL",
        ...
    ]
    async with self.async_engine.begin() as conn:
        for stmt in stmts:
            await conn.execute(text(stmt))

问题:

  1. 无版本号、无回滚:语句含破坏性/不可逆操作(DELETEALTER SET NOT NULL、唯一索引重建),老数据升级失败无法回退;
  2. api 与 worker 两进程并发执行同一批 DDL:存在锁冲突与重复执行风险;
  3. 任何一条语句写错即阻塞整个服务启动,且不易定位是哪条。

建议

  • 引入 Alembic 版本化迁移(项目已依赖 SQLAlchemy,天然适配),up/down 成对;
  • 启动时只做 Alembic upgrade head,不再启动时执行手写 DDL;
  • 破坏性语句(如 DELETE FROM api_keys)改为显式迁移脚本并在文档注明,避免每次启动重复执行。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions