3.4 KiB
3.4 KiB
Schema Mainline
当前结论
小虾 SaaS 当前数据库结构主线已经切换为:
- Schema 定义真源:
packages/adapters/sqlalchemy_impl/models.py - 迁移执行真源:
alembic/versions/001_current_schema_baseline.py及后续 Alembic revisions - 部署执行入口:
infra/docker/deploy-staging.sh中的alembic upgrade head
packages/adapters/sqlalchemy_impl/session.py::initialize_database() 仍保留为开发/测试兜底函数,但 API 和 Worker 默认不再调用它:
apps/api/app/config.py::AUTO_CREATE_SCHEMA = Falseapps/worker/worker_app/core/config.py::auto_create_schema = Falsepackages/adapters/sqlalchemy_impl/schema_guard.py会阻止 staging / production 开启自动建表
staging / production 不允许依赖 Base.metadata.create_all() 建表;表结构变更必须进入 Alembic revision。
已验证状态
截至 2026-06-21:
- Alembic baseline revision 已落地:
001_current_schema_baseline.py - staging 已完成 baseline stamp / upgrade
- staging 数据库
alembic_version已确认:002 - staging health endpoint 已确认 healthy
develop部署 job 已确认 succeeded- CI 已增加 Alembic offline upgrade SQL 生成检查,验证 migration 链可加载并能生成
upgrade headSQL - CI 已增加 SQLAlchemy metadata snapshot drift 检查,防止改 models 后忘记同步 Alembic revision / schema snapshot
已废弃入口
以下文件不得用于 staging / production 建库:
init-tables.sqlmigrations/001_initial_schema.sqlmigrations/004_asset_management.sql
这些 SQL 文件是历史快照,和当前 SQLAlchemy runtime schema 已经存在字段漂移。例如:
- 历史
init-tables.sql使用assets.library_id/storage_key/mime_type - 当前 SQLAlchemy 使用
assets.asset_library_id/file_url/file_type - 历史 SQL 文件没有完整覆盖
generation_tasks/generated_videos/tasks/milestones/task_issues
当前原则
- 新字段必须先改
packages/adapters/sqlalchemy_impl/models.py。 - 每次 schema 变更必须新增 Alembic revision。
- Repository 映射必须和 SQLAlchemy model 同步。
- Pydantic schema 只能表达 API 契约,不作为数据库真源。
- Domain dataclass 只能表达业务实体,不作为数据库真源。
- 历史 SQL 文件只允许作为参考,不允许部署脚本调用。
- staging / production 只允许通过 Alembic 升级 schema。
AUTO_CREATE_SCHEMA只能作为开发/测试兜底,staging / production 会被代码级 guard 阻止开启。
Schema Drift 检查
CI 使用 scripts/check_schema_metadata.py 对比当前 SQLAlchemy metadata 和 docs/schema-metadata-snapshot.json。
如果 schema 变更是有意的,必须同时:
- 修改
packages/adapters/sqlalchemy_impl/models.py。 - 新增 Alembic revision。
- 执行
python scripts/check_schema_metadata.py --write刷新 snapshot。 - 提交 models、revision、snapshot 三者。
下一步
后续 schema 工作应继续推进:
- 对 production 首次接入 Alembic 前,按
docs/PRODUCTION-RELEASE-CHECKLIST.md执行只读检查、备份、发布和 smoke。
禁止事项
- 不要新增
init-*.sql作为运行时建表入口。 - 不要手工维护和 SQLAlchemy models 平行的 CREATE TABLE 文件。
- 不要让 API schema 或 domain entity 直接驱动数据库 schema。
- 不要在部署脚本中执行历史 SQL 快照。
- 不要在 staging / production 打开
AUTO_CREATE_SCHEMA绕过 Alembic。