services.schema_migrations
源文件
services/schema_migrations.py· 由scripts/gen_api_docs.py自动生成,请勿手改
模块说明:
集中式数据库 Schema 版本管理 — PRAGMA user_version
用法: ensure_all_schemas() 在 Main.py 启动时调用。 所有 schema 变更必须在此注册迁移函数,不得在业务代码中写 ALTER TABLE。
版本号: 整数,从 1 开始。PRAGMA user_version = 0 视为"未知旧库"。
自动备份: 每次检测到需要迁移的库,先 VACUUM INTO 一份快照到 <库目录>/backups/ 下(保留最近 BACKUP_KEEP 份),迁移失败/回滚后可手动恢复。
函数
_migrate_mkt_v1_to_v2
def _migrate_mkt_v1_to_v2(db_path: str) -> strv1→v2: market_prices 新增 adjusted_price 列(EIV 计算用)
定义行:46
_migrate_mkt_v2_to_v3
def _migrate_mkt_v2_to_v3(db_path: str) -> strv2→v3: market_prices(fetch_time) 索引 — 加速 MAX(fetch_time) 与按时间过滤(主线程查询)
定义行:63
_migrate_mkt_v3_to_v4
def _migrate_mkt_v3_to_v4(db_path: str) -> strv3→v4: 为 market_volume_snapshots 收集统计信息(挂单变化聚合查询的规划器输入)。
定义行:76
_migrate_user_v1_to_v2
def _migrate_user_v1_to_v2(db_path: str) -> strv1→v2: user_blueprints 新增 cost_per_run 列
定义行:96
_migrate_user_v2_to_v3
def _migrate_user_v2_to_v3(db_path: str) -> strv2→v3: production_plans 新增各扩展列
定义行:130
_migrate_user_v3_to_v4
def _migrate_user_v3_to_v4(db_path: str) -> strv3→v4: production_plans 新增生产执行列(绑定蓝图/材料机库/缺口)
定义行:142
_migrate_user_v4_to_v5
def _migrate_user_v4_to_v5(db_path: str) -> strv4→v5: hangars/production_plans 加 solar_system_id,并补 v2→v3 遗漏的 facility_cost_mult。
定义行:168
_migrate_user_v5_to_v6
def _migrate_user_v5_to_v6(db_path: str) -> strv5→v6: hangars 加设施类型/设施税/改件 JSON 列(机库级工业配置)
定义行:193
_migrate_user_v6_to_v7
def _migrate_user_v6_to_v7(db_path: str) -> strv6→v7: plan_blueprint_bindings 多蓝图绑定表(一条计划绑定多张库存蓝图)
定义行:213
_migrate_user_v7_to_v8
def _migrate_user_v7_to_v8(db_path: str) -> strv7→v8: 回填 production_plans 空星系快照(从材料机库带出)。
定义行:228
_migrate_user_v8_to_v9
def _migrate_user_v8_to_v9(db_path: str) -> strv8→v9: 对缺失 v2 扩展列的 production_plans 重新补列。
定义行:258
_migrate_user_v9_to_v10
def _migrate_user_v9_to_v10(db_path: str) -> strv9→v10: production_plans 新增 deducted_materials 列(启动扣减快照,撤销精确返还)。
定义行:276
_migrate_user_v15_to_v16
def _migrate_user_v15_to_v16(db_path: str) -> strv15→v16: user_blueprints 原图权威化(runs<0 → is_bpo=1, runs=0)。
定义行:293
_migrate_user_v14_to_v15
def _migrate_user_v14_to_v15(db_path: str) -> strv14→v15: production_plans 新增 material_cost_snapshot 列(启动时成本快照)。
定义行:324
_migrate_user_v13_to_v14
def _migrate_user_v13_to_v14(db_path: str) -> strv13→v14: 修复「user_version 已是 13、但科研作业列不存在」的历史库。
定义行:349
_migrate_user_v12_to_v13
def _migrate_user_v12_to_v13(db_path: str) -> strv12→v13: production_plans 增科研作业列(拷贝/发明/ME-TE 研究并入计划)。
定义行:386
_migrate_user_v11_to_v12
def _migrate_user_v11_to_v12(db_path: str) -> strv11→v12: production_plans 增引用式子项需求列(共享合并 / 母项联动重算)。
定义行:412
_migrate_user_v10_to_v11
def _migrate_user_v10_to_v11(db_path: str) -> strv10→v11: price_snapshots 表从 UI 层收口到集中迁移。
定义行:431
_migrate_user_v16_to_v17
def _migrate_user_v16_to_v17(db_path: str) -> strv16→v17: 新增 asset_snapshots(每日资产快照)与 open_orders(挂单)两张表。
定义行:522
_migrate_user_v17_to_v18
def _migrate_user_v17_to_v18(db_path: str) -> strv17→v18: asset_snapshots 新增 line_value 列 + 新增 order_events 台账表。
定义行:542
_migrate_user_v18_to_v19
def _migrate_user_v18_to_v19(db_path: str) -> strv18→v19: 新增 esi_tokens 表(按角色绑定 ESI 刷新令牌)。
定义行:561
_migrate_user_v19_to_v20
def _migrate_user_v19_to_v20(db_path: str) -> strv19→v20: open_orders 加归属列 char_id / is_corp。
定义行:576
_migrate_user_v20_to_v21
def _migrate_user_v20_to_v21(db_path: str) -> strv20→v21: 回填制造计划的 product_name(按 product_type_id 取 SDE 权威名)。
定义行:595
_migrate_user_v21_to_v22
def _migrate_user_v21_to_v22(db_path: str) -> strv21→v22: watchlist_items 新增 added_price 列(加入关注时的 Jita 卖价)。
定义行:648
_migrate_bp_v2_to_v3
def _migrate_bp_v2_to_v3(db_path: str) -> strv2→v3: 蓝图表查找索引(实测逐件研究成本 3.92ms → 0.10ms)
定义行:666
_migrate_bp_v1_to_v2
def _migrate_bp_v1_to_v2(db_path: str) -> strv1→v2: blueprint_materials 新增 wastefactor 列
定义行:682
_table_exists
def _table_exists(conn: sqlite3.Connection, table: str) -> bool检查连接中是否存在指定表
定义行:742
_add_columns
def _add_columns(db_path: str, table: str, columns: list[tuple[str, str]]) -> int批量 ADD COLUMN,忽略已存在的列。返回实际新增的列数。
定义行:751
_open
def _open(db_path: str) -> sqlite3.Connection打开连接(带 busy_timeout,容忍启动期短暂写锁/被强杀后的句柄未释放)
定义行:772
_get_version
def _get_version(db_path: str) -> int读取 PRAGMA user_version
定义行:779
_set_version
def _set_version(db_path: str, version: int)写入 PRAGMA user_version
定义行:789
_backup_db
def _backup_db(db_path: str) -> str | None迁移前对库做一致快照(VACUUM INTO),返回备份文件路径;失败返回 None。
定义行:799
_cleanup_old_backups
def _cleanup_old_backups(backup_dir: str, pattern: str, keep: int=BACKUP_KEEP) -> None保留最近 keep 份备份,删除更早的。删除失败仅告警,不阻断。
定义行:827
_rebuild_table
def _rebuild_table(db_path: str, table: str, create_sql: str, copy_columns: list[str]) -> None大变动迁移:重建表结构并保留数据(改列类型/拆表/合并/重命名列)。
定义行:844
ensure_schema
def ensure_schema(db_alias: str) -> dict检查并迁移单个库的 schema。
定义行:881
ensure_all_schemas
def ensure_all_schemas() -> dict[str, dict]遍历所有 4 个库,执行必要的 schema 迁移。
定义行:947
get_db_version
def get_db_version(db_alias: str) -> int | None读取当前库的磁盘版本号(诊断用)
定义行:960
get_expected_version
def get_expected_version(db_alias: str) -> int | None返回代码中定义的预期版本号(诊断用)
定义行:971