# 全局配置与数据库同步 ## 1. 是否需要“同步到数据库”? **分两种理解:** ### (1)在页面上改完并保存 → 已实现 - **已实现**:在「全局配置」页修改任意配置项并保存时,后端会调用 `update_global_configs_batch`,对每条配置执行 `GlobalStrategyConfig.set(...)`。 - `GlobalStrategyConfig.set` 使用 **INSERT ... ON DUPLICATE KEY UPDATE**: - 若该 `config_key` 在表 `global_strategy_config` 中**不存在**,会**插入**一条新记录; - 若**已存在**,会**更新**该记录的 `config_value`、`config_type`、`category`、`description` 等。 - 因此:**新加的配置项(如 MAX_RSI_FOR_LONG、MIN_RSI_FOR_SHORT 等)只要在页面上改一次并点保存,就会自动写入数据库**,不需要单独“同步到数据库”的步骤。 ### (2)不打开页面,一次性把“缺省值”写入数据库 → 可选脚本 - 若希望新配置项**一开始就出现在数据库里**(方便备份、导出、或不在 UI 改也能看到默认值),可以执行一次**同步缺省脚本**。 - 脚本会检查 `global_strategy_config` 表,对**尚未存在的 key** 插入默认值;**已存在的 key 不会覆盖**。 --- ## 2. 已实现的能力小结 | 场景 | 是否已实现 | 说明 | |------|------------|------| | 在「全局配置」页修改并保存 | ✅ 是 | 调用 `POST /api/config/global/batch`,写入 `global_strategy_config` 表 | | 新 key 第一次保存 | ✅ 是 | `GlobalStrategyConfig.set` 用 INSERT ... ON DUPLICATE KEY UPDATE,会自动插入新 key | | 策略/后端读取配置 | ✅ 是 | `config_manager.get_trading_config()` 从全局配置表(及 Redis)读;缺省时用代码里的默认值 | | 一次性把缺省项写入 DB | ✅ 可选 | 运行 `backend/sync_global_config_defaults.py`(见下) | --- ## 3. 可选:一次性同步缺省到数据库 若希望把**新增的全局配置项默认值**一次性写入 `global_strategy_config` 表(不覆盖已有记录),可在项目根目录或 backend 目录执行: ```bash # 在项目根目录 cd backend && python sync_global_config_defaults.py # 或(若 PYTHONPATH 已含 backend) python backend/sync_global_config_defaults.py ``` 脚本会: - 只插入**当前在表中不存在的** `config_key`; - 已存在的 key **不会**被修改; - 默认会同步的项包括:`MAX_RSI_FOR_LONG`、`MAX_CHANGE_PERCENT_FOR_LONG`、`MIN_RSI_FOR_SHORT`、`MAX_CHANGE_PERCENT_FOR_SHORT`、`TAKE_PROFIT_1_PERCENT`、`SCAN_EXTRA_SYMBOLS_FOR_SUPPLEMENT`、`BETA_FILTER_ENABLED`、`BETA_FILTER_THRESHOLD` 等(见脚本内 `DEFAULTS_TO_SYNC`)。 **结论**: - **需要同步到数据库吗?** 若你会在「全局配置」里改这些项并保存,则**不需要**额外同步,保存即写入数据库。 - **有实现吗?** 有:保存即写入;另提供可选脚本,用于一次性把缺省值写入数据库。