3.7 KiB
3.7 KiB
Work Log - 修复 API 启动阶段 users 主键列兼容问题(2026-05-01)
-
背景:
- 启动报错
psycopg.errors.UndefinedColumn: column users.user_id does not exist,触发点在seed_defaults -> _seed_permissions的关系加载 SQL。 - 当前 ORM 与外键约定统一使用
users.user_id,但历史库可能残留users.id主键列命名。
- 启动报错
-
本次改动:
api/app/core/database.py- 新增
_ensure_user_pk_column_compatibility()。 - 在
init_db()执行Base.metadata.create_all()前,针对 PostgreSQL 做一次兼容检查:- 若
users表存在,且检测到仅有id而没有user_id,自动执行:ALTER TABLE users RENAME COLUMN id TO user_id。 - 其余情况不改动(已是
user_id或两者都不存在时直接跳过)。
- 若
- 新增
-
验证:
- 在
fquiz-api容器内执行init_db():init_db_ok。 - 在
fquiz-api容器内执行查询,确认当前数据库users列包含user_id。
- 在
-
风险与影响:
- 影响范围:仅 PostgreSQL 且仅触发于“存在
users.id且缺少users.user_id”的历史库。 - 该变更属于启动期一次性 DDL 兼容动作;对已规范为
users.user_id的库无行为变化。
- 影响范围:仅 PostgreSQL 且仅触发于“存在
Work Log - 修复 API 启动时报 users.user_name / users.username 列不一致(2026-05-01)
-
背景:
- API 启动阶段在
seed_defaults -> _seed_permissions查询中触发 ORM 关系预加载,SQL 使用了users.user_name,但当前 PostgreSQLusers表实际字段为username,导致psycopg.errors.UndefinedColumn,服务启动失败。
- API 启动阶段在
-
本次改动(最小闭环):
- 文件:
api/app/core/config.py- 新增配置
user_username_column(环境变量USER_USERNAME_COLUMN),可选值username/user_name,默认username。
- 新增配置
- 文件:
api/app/models/user.pyUser.username列改为基于settings.user_username_column动态映射,兼容两类历史库结构。
- 文件:
docker-compose.yml- 为
api/celery-worker/celery-beat注入USER_USERNAME_COLUMN环境变量透传。
- 为
- 文件:
.env.example- 新增
USER_USERNAME_COLUMN=username示例配置。
- 新增
- 文件:
-
验证:
python3 -m py_compile api/app/core/config.py api/app/models/user.py api/app/services/seed_service.py-> 通过。USER_USERNAME_COLUMN=user_name POSTGRES_PORT=5434 docker compose up -d --no-deps api-> 启动成功。USER_USERNAME_COLUMN=user_name POSTGRES_PORT=5434 docker compose ps api->Up (healthy)。curl -fsS http://127.0.0.1:8000/health->{"status":"ok","service":"fquiz-api","version":"0.1.0"}。
-
风险与影响:
- 影响面集中在
User模型用户名字段映射。 - 运行环境需明确
USER_USERNAME_COLUMN与目标数据库实际字段一致;配置错误会在启动阶段继续抛UndefinedColumn。
- 影响面集中在
Work Log - GitHub Actions 部署分支切换为 dev(2026-05-01)
-
背景:
- 当前 workflow 仅监听
mainpush,且 deploy job 条件写死为refs/heads/main,导致dev推送不触发自动部署。
- 当前 workflow 仅监听
-
本次改动(最小改动):
- 文件:
.github/workflows/main.ymlon.push.branches从main改为dev。deploy.if从github.ref == 'refs/heads/main'改为github.ref == 'refs/heads/dev'。
- 文件:
-
预期行为:
git push origin dev:自动触发构建,并在构建成功后执行 deploy。main分支 push:不再触发该 workflow 自动部署链路。
-
风险与影响:
- 生产发布入口从
main切换到dev,需确认团队分支策略已同步。 workflow_dispatch若在非dev分支触发,deploy job 会被if条件跳过。
- 生产发布入口从