标题: [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))
问题:
- 无版本号、无回滚:语句含破坏性/不可逆操作(
DELETE、ALTER SET NOT NULL、唯一索引重建),老数据升级失败无法回退;
- api 与 worker 两进程并发执行同一批 DDL:存在锁冲突与重复执行风险;
- 任何一条语句写错即阻塞整个服务启动,且不易定位是哪条。
建议
- 引入 Alembic 版本化迁移(项目已依赖 SQLAlchemy,天然适配),
up/down 成对;
- 启动时只做 Alembic
upgrade head,不再启动时执行手写 DDL;
- 破坏性语句(如
DELETE FROM api_keys)改为显式迁移脚本并在文档注明,避免每次启动重复执行。
标题: [Bug][可维护性] Schema 迁移全部走启动时手写 SQL(ensure_knowledge_schema/ensure_business_schema),无版本化无回滚
正文:
问题
backend/package/yuxi/storage/postgres/manager.py(约 122 行起)在服务启动时(api 的 lifespan 与 worker 启动流程)逐条执行上百条手写 DDL:问题:
DELETE、ALTER SET NOT NULL、唯一索引重建),老数据升级失败无法回退;建议
up/down成对;upgrade head,不再启动时执行手写 DDL;DELETE FROM api_keys)改为显式迁移脚本并在文档注明,避免每次启动重复执行。