# 全局配置与数据库同步

## 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`）。

**结论**：  
- **需要同步到数据库吗？** 若你会在「全局配置」里改这些项并保存，则**不需要**额外同步，保存即写入数据库。  
- **有实现吗？** 有：保存即写入；另提供可选脚本，用于一次性把缺省值写入数据库。
