数据格式
SQLite 数据库结构
4 个独立 SQLite 文件,通过 ATTACH DATABASE 支持跨库查询。
reference.db — 静态参考数据
从 CCP 官方 SDE 导入,只读:
| 表 | 关键字段 | 说明 |
|---|---|---|
item | type_id, zh_name, en_name, category_id, group_id, volume, icon_id, ... | 物品基础信息(16 字段) |
market_tree | node_id, parent_id, name | 市场分类树 |
industry_system_costs | solar_system_id, activity, cost_index | 工业系统成本指数 |
item_dogma | type_id, attribute_id, value | 物品 dogma 属性 |
type_materials | type_id, material_type_id, quantity | 矿石精炼材料表 |
market.db — 市场价格数据
频繁覆写,~18 MB:
| 表 | 字段 | 说明 |
|---|---|---|
market_prices | type_id, buy_price, sell_price, buy_volume, sell_volume, fetch_time | 实时订单价格快照 |
market_volume_snapshots | type_id, volume, fetch_time | 成交量快照 |
price_history | type_id, region_id, date, average, highest, lowest, volume, order_count, fetched_at;主键 (type_id, region_id, date);另有 (region_id, date) 索引 idx_price_history_region_date(services/price_history.PRICE_HISTORY_INDEX_DDL,建表时 CREATE INDEX IF NOT EXISTS,「更新价格」的 init_db 也会建) | 日级成交市场历史(成交均价 + 成交量 + 订单数),是「日订单量 / 日成交量」两列与大盘指数的数据源。覆盖集 = 制造产物 ∪ 反应产物 ∪ 被当材料的 type(1646)∪ PLEX = 5554 个(2026-10 实测);请求量 = 5554 × 勾选的中心数(单中心约 4.6 分钟 @20 req/s);历史是一次拉全的(ESI 每个 type 一次给 398 天左右,不是按天攒)。⚠️ 聚合窗口是「最近 7 个日历天」(services/price_history.get_history_summary,窗口内没有记录的日子按 0 计入 —— ESI 只返回有成交的日子,取「最近 7 条」会变成「上次活跃那几天」的平均值);本地 fetched_at 也早于窗口时给 —(不知道),不拿 0 冒充。⚠️ 尾部残缺日:ESI 的历史按天逐步出,最新一两天常只有几百个 type(实测 2026-10-04 只有 434 个、前一天 2,926 个)—— services/market_index_service._last_history_day / ui_qml/bridge/market_pulse_bridge._turnover_series 都把这种日子排除在「锚点日」与「成交额环比」之外,否则广度会从 2,300+ 掉到 399、成交额假报 −83.6%。写入方有两处:services/importers/getprices.fetch_and_save_histories(「更新价格」流程,按本次勾选的贸易中心逐个拉、按 12h TTL 增量、每 (type_id, region_id) 只保留近 180 天)与 services/price_history.save_cache(价格走势图,单 type 单区域全量覆盖写)。建表 DDL 单一来源是 services/price_history.PRICE_HISTORY_DDL |
global_price_daily | type_id, date, average_price, adjusted_price, fetched_at;主键 (type_id, date) | 全服统一价的每日快照 —— /markets/prices/ 的 average_price/adjusted_price(CCP 口径的全服价,没有区域划分)。只存没有区域成交历史的品种(当前只有 PLEX 44992:ESI 的 /markets/{rid}/history/ 对它恒返回空列表,实测 Jita/Amarr 都是空)。由「更新价格」第 1 步顺手写入(1 次请求已经拉过,只写 1 行/天);它是大盘 PLEX 锚的数据源,口径与另外四条指数的区域成交均价不同,UI 上必须标出来。DDL 单一来源 services/importers/getprices.GLOBAL_PRICE_DDL |
blueprint.db — 蓝图数据
从 SDE 导入,只读:
| 表 | 说明 |
|---|---|
blueprint_activities | 蓝图活动信息(manufacturing/invention/copying 等) |
blueprint_materials | 蓝图材料清单(含数量和 ME 信息) |
blueprint_products | 蓝图产出(物品 ID、产出数量) |
blueprint_skills | 蓝图所需技能 |
user.db — 用户数据
增删改,随使用增长:
| 表 | 说明 |
|---|---|
hangars | 机库定义(名称/星系/设施类型/设施税/改件) |
inventory_items | 库存物品(type_id, 数量, 加权平均成本) |
user_blueprints | 用户蓝图(BPO/BPC, ME/TE, runs, quantity)。不变量:is_bpo=1(原图)⇒ runs=0,原图视为无限流程、永不被下线消耗或删除(v15→v16 迁移与剪贴板解析同口径维护) |
production_plans | 工业计划(activity 区分制造/拷贝/发明/ME-TE 研究;科研专属列 decryptor_type_id/success_rate/research_target_level/actual_output_runs,语义见 flows.md 科研计划节) |
plan_blueprint_bindings | 计划 ↔ 蓝图 多对多绑定(runs_used) |
price_snapshots | 计划价格快照 |
procurement_items | 采购清单 |
watchlist_items | 自选清单 |
user_skills | 角色技能数据 |
data/ 目录
运行时配置与缓存文件:
| 文件 | 说明 | 格式 |
|---|---|---|
data/settings.json | 用户设置(主题、自动更新间隔、默认机库引用等),含 settings_version 结构版本,由 services/user_settings.py 惰性迁移升级 | JSON |
data/char_config.json | 多角色配置(技能、所在地、资金) | JSON |
data/score_settings.json | 评分参数设置 | JSON |
data/search_history.json | 搜索历史(最近 20 条) | JSON |
data/window_geometry.json | 窗口位置和大小。启动时若记录的位置与任一屏幕的可用区域都不相交(例如上次在离屏平台/已拔掉的显示器上算出的负坐标),回正为主屏居中并夹进可用区域 | JSON |
data/update_progress.json | 数据更新进度 | JSON |
data/caches/icons/ | 物品图标缓存 | PNG |
data/terminology.json | EVE 术语映射表(技能名翻译等) | JSON |
Schema 迁移与备份
所有数据库 Schema 变更通过 services/schema_migrations.py 注册,用 PRAGMA user_version 追踪版本 (当前:ref=1, mkt=3, user=11, bp=2)。
启动时 ensure_all_schemas() 自动执行待应用的迁移;每次检测到需要迁移的库,先 VACUUM INTO 快照到 database/backups/(保留最近 5 份),迁移出错可手动恢复。
- 加列(最常见)→
_add_columns(幂等) - 大变动(改列类型/拆表/合并/重命名列)→
_rebuild_table(单事务重建表并保留数据)
完整规范见 schema-migration.md。
⚠️ 禁止在业务代码中直接写
ALTER TABLE,必须通过迁移系统。
data/settings.json 版本迁移
settings.json 的键结构变更走 services/user_settings.py 的 SETTINGS_SCHEMA_VERSION + _SETTINGS_MIGRATIONS 机制:读取时惰性升级、保留所有未知键、落盘后返回。 设置里 default_*_hangar_id 引用 hangars.id,机库表被重建(id 漂移)时这些引用会失效—— 这是机库设置"变回默认"的典型场景,升级后如失效需重新指定默认机库。
SDE 数据来源
- 地址:
https://sde.jita.space/latest - 格式:ZIP 压缩包(含 YAML/JSON 数据)
- 首次启动自动下载并导入
reference.db和blueprint.db
ESI API 使用
| 接口 | 用途 |
|---|---|
/markets/{region_id}/orders/ | 市场订单簿(买单/卖单) |
/markets/{region_id}/history/ | 每日成交量历史 |
/markets/prices/ | ESI 调整价格(7日均价) |
/industry/systems/ | 工业系统成本指数 |
/universe/types/{type_id}/ | 物品详细信息 |