# 变更审计记录:修复 DatabaseOperations 缺少 _dsn 属性导致 DWD 并行装载全部失败 | 字段 | 值 | |------|-----| | 日期 | 2026-03-06 09:17:16 | | Prompt-ID | P20260306-084752 | | Session-ID | 9381400d | | Session 路径 | docs/audit/session_logs/2026-03/06/37_e5276b93_082544 | ## 操作摘要 修复 DWD 并行装载全部失败的 bug:`'DatabaseOperations' object has no attribute '_dsn'`。在 `database/operations.py` 的 `DatabaseOperations` 类中新增 `_dsn`、`_session`、`_connect_timeout` 三个 property,透传底层 `DatabaseConnection` 的同名属性,使 `DwdLoadTask._process_single_table()` 在线程池中能正确获取连接参数创建独立连接。 ## 根因分析 - `DwdLoadTask._process_single_table()` 在线程池中为每个线程创建独立 `DatabaseConnection`,需要访问 `self.db._dsn`、`self.db._session`、`self.db._connect_timeout` - `self.db` 是 `DatabaseOperations`(来自 `database/operations.py`),它是组合模式(持有 `_connection` 引用),不继承 `DatabaseConnection` - 因此 `DatabaseOperations` 没有 `_dsn` 属性,导致所有 40 个 DWD 表的并行装载全部 `AttributeError` - 注意:`database/base.py` 中有另一个 `DatabaseOperations` 继承自 `DatabaseConnection`(有 `_dsn`),但实际运行时使用的是 `database/operations.py` 中的版本 ## 触发场景 用户从 admin-web 启动 ETL 任务,任务开始时间 2026/3/6 08:47:52,日志中 40 个 DWD 表全部报错: ``` DWD 并行装载失败:dwd.xxx,err='DatabaseOperations' object has no attribute '_dsn' ``` ## 风险评估 极低风险 — property 只是透传底层 `_connection` 的已有属性,不改变任何逻辑。 ## 验证 - getDiagnostics 无问题 - 334 个单元测试通过(3 个 hypothesis deadline/属性测试超时与本次修改无关) ## 本次对话文件变更 ### 新增文件 - `docs/audit/prompt_logs/prompt_log_20260306_085216.md` - `docs/audit/session_logs/2026-03/06/37_e5276b93_082544/main_12_9381400d.md` - `docs/audit/session_logs/2026-03/06/37_e5276b93_082544/sub_01_9381400d.md` - `docs/prd/specs/P5.2-miniapp-fe-all-pages.md` ## 改动注解 ### `apps/etl/connectors/feiqiu/database/operations.py` - 变更类型:修改 - 原始原因:DWD 并行装载任务在线程池中创建独立数据库连接时,需要从 `self.db`(`DatabaseOperations` 实例)读取 `_dsn`、`_session`、`_connect_timeout` 属性,但 `DatabaseOperations` 是组合模式(持有 `_connection` 引用),不继承 `DatabaseConnection`,导致 `AttributeError` - 思路分析:采用 property 透传模式,在 `DatabaseOperations` 上新增三个只读 property,直接委托给底层 `_connection` 对象的同名属性。这是最小侵入性的修复方式——不改变类的继承结构,不影响现有方法,仅补齐缺失的属性访问路径 - 修改结果:DWD 并行装载的 40 个表可以正常在线程池中创建独立连接,不再抛出 `AttributeError`。影响范围仅限于 `DwdLoadTask._process_single_table()` 的线程内连接创建路径 ## DDL/迁移检查 - 无新增迁移 SQL - 无 DDL 基线变更 ## OpenAPI Spec 同步 - 无接口变更