fix(P1): 消除迁移漂移、回测缓存污染与历史数据越界风险
P1-1 schema/ORM 漂移: - 新增 0006 迁移: 回填后 drop 幽灵列 predictions.cutoff_at, 并幂等重建 ix_match_stats_available_at / ix_predictions_cutoff_at - models.py 为 MatchStats / Prediction 声明上述两个索引, 使 autogenerate 不再误建议删除 P1-2 迁移对历史越界数据不安全: - 0004 在建 CHECK 约束前先 op.execute 清洗越界行 (负数进球/置信度越界/非法 1x2/mode),避免 ALTER 中途失败 导致迁移卡在半完成状态 P1-3 回测缓存污染: - predict_match / _predict_single 新增 use_cache 参数, use_cache=False 时既不读也不写进程内缓存 - run_backtest 显式传 use_cache=False,避免 settle 到旧记录 P1-5 understat 关系属性访问: - MatchRepository.find_by_teams_and_date 加 selectinload(Match.stats) P1-6 日期键构造不统一: - bzzoiro 抽取 _to_date()/_match_key() 统一去重键构造, 消除 str(date) 与 isoformat() 的隐式格式依赖
This commit is contained in:
@@ -133,6 +133,11 @@ class MatchStats(Base):
|
||||
|
||||
match: Mapped[Match] = relationship(back_populates="stats")
|
||||
|
||||
__table_args__ = (
|
||||
# 数据血缘时间过滤查询用(按 available_at 取「赛前已可得」的统计)
|
||||
Index("ix_match_stats_available_at", "available_at"),
|
||||
)
|
||||
|
||||
|
||||
class Injury(Base):
|
||||
"""球员伤停记录(api-football 数据源)。"""
|
||||
@@ -195,6 +200,8 @@ class Prediction(Base):
|
||||
__table_args__ = (
|
||||
Index("ix_predictions_match", "match_id"),
|
||||
Index("ix_predictions_provider_model", "provider", "model"),
|
||||
# 数据截止时间过滤查询用(按 prediction_cutoff_at 取「赛前已生成」的预测)
|
||||
Index("ix_predictions_cutoff_at", "prediction_cutoff_at"),
|
||||
# 数据库级约束:最后一道防线
|
||||
CheckConstraint("pred_home_goals >= 0", name="ck_pred_home_goals_nonneg"),
|
||||
CheckConstraint("pred_away_goals >= 0", name="ck_pred_away_goals_nonneg"),
|
||||
|
||||
Reference in New Issue
Block a user