fix(#5450): bars sync 已是最新时不抛 ValueError 静默 proc=0#6270
Conversation
fast_mode 下库中最新 timestamp 已到今天时,_get_fetch_date_range 算出 start_date=明天 > end_date=今天,_validate_and_set_date_range 抛 ValueError 被 sync_smart except 吞成 ServiceResult.error,sync_history 记 proc=0 无说明。 修复: sync_smart 在 _get_fetch_date_range 后加守卫,start_date>end_date 时 返回 success + '已是最新' message + metadata(reason=already_up_to_date), 不再让空范围 ValueError 冒泡。
Kaoruha
left a comment
There was a problem hiding this comment.
Code review
No issues found. Checked for bugs and CLAUDE.md compliance.
🤖 Generated with Claude Code
Code reviewFound 1 issue:
service 层守卫本身正确(返回 Lines 586 to 595 in 00267a3 建设性建议(非 blocking,供补全时一并考虑):
service 层修复方向正确(不再 ValueError 吞成 fail),3 层分层合规,DataSyncResult API 复用既有模式。补 API 层透传即可端到端满足 #5450。 🤖 Generated with Claude Code - If this code review was useful, please react with 👍. Otherwise, react with 👎. |
service 层(PR #6270 守卫)对"已是最新"返回 ServiceResult.success(message=..., data=DataSyncResult(metadata reason=already_up_to_date)),但 API 层 _record_sync_result 不读 dsr.metadata.reason 也不透传 result.message, sync_history 仍记 status=partial/proc=0 无说明,验收标准 2 端到端未满足 (review on PR #6270 定位的 blocking)。 修:_record_sync_result success 分支前置检测 dsr.metadata.reason, 带 reason(如 already_up_to_date)→status=success + result.message 透传到 error_message(model 唯一 Text 字段,get_history 端到端返回),不加 schema 字段避免 DB 安全阀。 测试:tests/api/test_data_sync_result_record.py 2 例(已是最新→success+ 说明透传;正常成功→error_message 不污染)。 Co-Authored-By: Claude <noreply@anthropic.com>
|
续修 review blocking(commit |
Summary
修复 #5450:
POST /api/v1/data/sync {type:bars, codes:["000001.SZ"]}始终proc=0/added=0/updated=0,而 600519.SH 正常proc=1。根因
调用链:
sync_data→bar_service.sync_smart(code, fast_mode=True)→_get_fetch_date_range→sync_range→_validate_and_set_date_rangefast_mode 下
_get_fetch_date_range(bar_service.py:907-912):000001.SZ 库中最新 bars 已是今天(高频更新)→
start_date = 明天 > end_date = 今天→_validate_and_set_date_range(bar_service.py:1059)抛ValueError: Start date ... cannot be later than end date→ sync_smart 的 except(bar_service.py:303)吞异常 →ServiceResult.error→ API_record_sync_result记record_fail(processed=0)。600519.SH 最新数据较早 →
start ≤ end→ 正常 fetchproc=1。影响范围:任何"数据已更新到今天"的 code 同步都会触发(普遍逻辑缺陷,非 000001.SZ 独有)。
修复
sync_smart在_get_fetch_date_range之后加守卫:fast_mode and start_date > end_date时返回明确的"已是最新"结果,不进 sync_range:满足验收标准 2("数据已最新时说明为何 0 records")。API 层
_record_sync_result从record_fail改善为record_complete(partial)+ 明确 message,不再有误导性的 "Start date cannot be later than end date" 错误。Test plan
test_fast_mode_data_up_to_date_returns_already_latest:fast_mode + latest=今天 → success + message 含"最新" + data_source 不被调用 + records_processed=0test_fast_mode_data_up_to_date_metadata_reason:metadata(reason=already_up_to_date)test_bar_service_mock.py17 测试不回归(19 passed)Closes #5450