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

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

Closed

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

建议

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

Activity

  1. xerrors commented on Oct 23, 2026

    @xerrors
    Owner

    已在 develop/0-8-0 通过 Schema 初始化重构处理。建表和索引现在只由 app-init 在 PostgreSQL advisory lock 下执行,API 和 worker 启动时只做版本校验,不再并发执行手写 DDL;当前采用 fresh baseline + 版本表,不再支持历史库原地增量迁移。原 issue 建议的 Alembic up/down 没有采用,这是当前版本的明确取舍。

    此 Issue 现关闭。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

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