feat(etl): cfg_* 视图入口统一 + NULL 兼容 + 3 处 _load_* 历史 Bug (W1-T2 / P0-1)
Wave 1 Day 3 沙箱配置参数切片。 DB 迁移 (20260504__cfg_views_null_compatible.sql): - 4 个 v_cfg_* 视图 WHERE 加 NULL 兼容 (effective_to IS NULL OR effective_to >= ...) - 顺手清理 v_cfg_assistant_level_price / v_cfg_performance_tier WHERE 重复一次的 bug - 测试库已执行,4 校验 PASS ETL 代码 (4 处 SQL): - base_index_task.py: FROM dws.cfg_index_parameters -> app.v_cfg_index_parameters - base_dws_task.py 3 处 _load_* (performance_tier / level_price / bonus_rules) 改 FROM app.v_cfg_*,顺手修历史 Bug:原 SQL 不带 effective_from/to WHERE 效果: - 修复视图 NULL 行被过滤问题(SPI 27 行原本读到 0) - 沙箱模式回放历史日期时,参数自动按 sandbox_date 切片 - _load_* 直接得到当前生效行(原 12/9 行历史 Python 挑) 参考: - docs/audit/changes/2026-05-04__wave1_t2_scd2_view_unify.md - docs/database/changes/2026-05-04__cfg_views_null_compatible.md
This commit is contained in:
105
docs/database/changes/2026-05-04__cfg_views_null_compatible.md
Normal file
105
docs/database/changes/2026-05-04__cfg_views_null_compatible.md
Normal file
@@ -0,0 +1,105 @@
|
||||
# cfg_* 视图 NULL 兼容性 + 重复 WHERE 清理
|
||||
|
||||
| 字段 | 值 |
|
||||
|---|---|
|
||||
| 日期 | 2026-05-04 |
|
||||
| 触发 | Wave 1 W1-T2 (P0-1 沙箱配置参数切片) |
|
||||
| 迁移文件 | `db/etl_feiqiu/migrations/20260504__cfg_views_null_compatible.sql` |
|
||||
| 涉及视图 | `app.v_cfg_index_parameters` / `app.v_cfg_assistant_level_price` / `app.v_cfg_performance_tier` / `app.v_cfg_bonus_rules` |
|
||||
|
||||
## 一、变更说明
|
||||
|
||||
修复 20260502 迁移产出的 4 个 v_cfg_* 视图的两个问题:
|
||||
|
||||
### Bug 1: NULL 兼容性
|
||||
|
||||
原 WHERE 写为:
|
||||
```sql
|
||||
effective_to >= app.business_date_now()
|
||||
```
|
||||
|
||||
`effective_to` 是 nullable(NULL 表示"至今仍生效"),NULL 行被过滤。
|
||||
`cfg_index_parameters` 中 27 行 SPI 参数大量为 `effective_to IS NULL`,通过视图读时**全部被过滤,看不到任何 SPI 参数**。
|
||||
|
||||
### Bug 2: 重复 WHERE
|
||||
|
||||
`v_cfg_assistant_level_price` / `v_cfg_performance_tier` 的 WHERE 子句重复一次(逻辑等价但代码瑕疵):
|
||||
```sql
|
||||
WHERE effective_from <= ... AND effective_to >= ...
|
||||
AND effective_from <= ... AND effective_to >= ...
|
||||
```
|
||||
|
||||
## 二、修复方式
|
||||
|
||||
ALTER VIEW 4 个视图(用 `CREATE OR REPLACE VIEW`),WHERE 改为:
|
||||
```sql
|
||||
WHERE effective_from <= app.business_date_now()
|
||||
AND (effective_to IS NULL OR effective_to >= app.business_date_now())
|
||||
```
|
||||
|
||||
## 三、兼容性影响
|
||||
|
||||
### ETL
|
||||
|
||||
`apps/etl/connectors/feiqiu/tasks/dws/index/base_index_task.py` 与
|
||||
`apps/etl/connectors/feiqiu/tasks/dws/base_dws_task.py`(共 4 处 SQL)
|
||||
本轮一并改造为通过 `app.v_cfg_*` 读取参数,享受沙箱切片语义。
|
||||
|
||||
### 后端
|
||||
|
||||
后端通过 FDW 映射访问 `fdw_etl.v_cfg_*` ↔ `app.v_cfg_*`,底层视图修复后**自动生效**。
|
||||
后端 `runtime_context` 服务层会下发 `app.current_business_date` GUC,沙箱模式读取
|
||||
sandbox_date 当时生效的参数版本。
|
||||
|
||||
### 小程序
|
||||
|
||||
无直接影响(小程序通过后端 API 读)。
|
||||
|
||||
## 四、回滚策略
|
||||
|
||||
如发现新视图有问题,回滚到 20260502 版本:
|
||||
|
||||
```sql
|
||||
-- 重新执行 20260502 迁移文件中 L711-782 的 4 个 CREATE OR REPLACE VIEW 部分
|
||||
```
|
||||
|
||||
注意:回滚后 NULL 兼容性问题会重现(SPI 参数读不到)。
|
||||
|
||||
## 五、验证 SQL(测试库已执行 PASS)
|
||||
|
||||
```sql
|
||||
-- 校验 1: 视图 SPI 行数应等于 27(测试库实际值)
|
||||
SELECT COUNT(*) FROM app.v_cfg_index_parameters WHERE index_type = 'SPI';
|
||||
-- 期望: 27 ✅
|
||||
|
||||
-- 校验 2: 裸表带等价 WHERE,应与 1 相同
|
||||
SELECT COUNT(*) FROM dws.cfg_index_parameters
|
||||
WHERE index_type = 'SPI'
|
||||
AND effective_from <= CURRENT_DATE
|
||||
AND (effective_to IS NULL OR effective_to >= CURRENT_DATE);
|
||||
-- 期望: 27 ✅
|
||||
|
||||
-- 校验 3: 切沙箱时间为 2026-03-01,视图应正确切片
|
||||
BEGIN;
|
||||
SET LOCAL app.current_business_date = '2026-03-01';
|
||||
SELECT COUNT(*) FROM app.v_cfg_index_parameters WHERE index_type = 'SPI';
|
||||
-- 期望: 27(2026-03-01 在当前 effective 范围内)✅
|
||||
ROLLBACK;
|
||||
|
||||
-- 校验 4: 其他 3 个视图 vs 裸表等价 WHERE
|
||||
SELECT 'level_price' AS v, COUNT(*) FROM app.v_cfg_assistant_level_price
|
||||
UNION ALL SELECT 'perf_tier', COUNT(*) FROM app.v_cfg_performance_tier
|
||||
UNION ALL SELECT 'bonus_rules', COUNT(*) FROM app.v_cfg_bonus_rules;
|
||||
-- 测试库实测: 5 / 5 / 3 (与等价 WHERE 一致 ✅;裸表全量 5 / 12 / 9)
|
||||
```
|
||||
|
||||
## 六、生产部署
|
||||
|
||||
- 测试库:已应用 ✅(2026-05-04)
|
||||
- 生产库:**待 P11 上线门槛达标后由 Neo 手动执行**
|
||||
|
||||
## 七、关联
|
||||
|
||||
- 调研:[`docs/_overview/04a-feedback/P0-1-sandbox-snapshot-design.md`](../_overview/04a-feedback/P0-1-sandbox-snapshot-design.md) F-1 子代理
|
||||
- 审计:[`docs/audit/changes/2026-05-04__wave1_t2_scd2_view_unify.md`](../audit/changes/2026-05-04__wave1_t2_scd2_view_unify.md)
|
||||
- P20 SPEC:[`docs/prd/specs/P20-runtime-context-sandbox.md`](../prd/specs/P20-runtime-context-sandbox.md) §3.5
|
||||
Reference in New Issue
Block a user