fix: stop repeated allow_balance_pay column migration on restart - #5361
Conversation
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: Organization UI Review profile: CHILL Plan: Pro Run ID: 📒 Files selected for processing (1)
WalkthroughThis PR updates the ChangesGORM Default Tag Migration
Estimated code review effort🎯 1 (Trivial) | ⏱️ ~3 minutes Possibly related PRs
Suggested reviewers
Poem
🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
合并上游 3fcd741..0b7ae4e 共 23 个提交(含 tag v1.0.0-rc.13 / rc.14)。 主要上游内容: - 仪表盘新增流量 Sankey 流向图(model/usedata_flow.go 等新表/统计)、可交互高亮、敏感数据开关 - DataTable 卡片/表格视图切换、渠道卡片重构、移动端卡片布局 - 模型路由可靠性管理(routing-reliability-section)、渠道敏感信息开关 - 迁移修复:allow_wallet_overflow / allow_balance_pay 重复 ALTER 迁移(QuantumNous#5616 QuantumNous#5361) - 用量日志按登录类型筛选修复、CN 模型图标、计费历史弹窗分页修复 - CLAUDE.md 新增后端规则:避免 GORM 布尔 default 标签导致重启反复 ALTER 冲突处理(兼容本地白标/性能指标功能): - 上游将 perf_metrics_setting 从「性能」页迁移至「监控与告警(alerts)」页(MonitoringSettingsSection)。 采纳上游结构,并把本仓库的成功率阈值/错误码白名单/无数据视为满额(success_rate_green/yellow_threshold、 error_code_whitelist、no_data_as_full)四项特性一并移植进 MonitoringSettingsSection,保持功能不丢失。 - performance-section.tsx 采用上游版本(perf_metrics 已移出)。 - section-registry.tsx 将上述四项接入 alerts 段 defaultValues。 验证:go build ./... 通过;web/default tsc -b 类型检查通过。
合并后 codex + 多代理审查发现的两处低风险项: - model/main.go: migrateDBFast() 当前为死代码(仅 migrateDB() 在 InitDB 被调用), 但它缺少 migrateDB() 的失败即停预检(价格精度、model_limits、用户名唯一放松、 site_id 回填)。一旦将来被接入启动路径,会在 MySQL 非严格模式下静默截断 price_amount 等数据。为其补齐与 migrateDB() 一致的有序预检 + site_id 回填, 消除潜在的无损迁移隐患(防御性,非当前可触发缺陷)。 - service/http_client.go: ValidateRelayTargetURL 注释错误地称 SSRF 防护“默认关闭”, 实际 fetch_setting.go 默认 EnableSSRFProtection=true。更正注释以免误导。 未在本次改动的审查发现(已在汇报中列出,建议作为后续): - [中] SSRF DNS-rebinding TOCTOU:ValidateURL 解析校验后 http.Transport 连接时二次解析, 无 IP pinning(共享 HTTP 客户端层面的既有问题,修复涉及面广,单列跟进)。 - [低] SubscriptionPlan.Enabled 仍带 gorm:"default:true",MySQL 每次重启重复 ALTER (上游 QuantumNous#5616/QuantumNous#5361 同类修复遗漏项;改 *bool 影响支付校验等 7 处,单列跟进)。 - [信息] 子站 footer/notice 富文本 XSS 为既有特性(HTML/iframe 嵌入),本次新增 home_badge/title 字段按文本渲染,安全。 验证:go build ./... 通过;model 迁移用例通过。
当前 bool类型的列, 如果
default:true会造成每次启动时, 如果是mysql数据库 migrate会重复报:
model/main.go:304 [60.293ms] [rows:0] ALTER TABLEsubscription_plansMODIFY COLUMNallow_balance_payboolean DEFAULT true因为mysql的bool默认值是1, true每次会被识别为不匹配
但如果改成
default:1又会造成如果是postgres数据库 migrate会重复报:
model/main.go:304 [60.293ms] [rows:0] ALTER TABLEsubscription_plansMODIFY COLUMNallow_balance_payboolean DEFAULT 1目前无论使用哪种默认值, 都无法兼容mysql和pg数据库
🚀 变更类型 / Type of change
最好的方案是去除默认值, 由业务决定默认值,而且这也更符合代码逻辑直觉
✅ 提交前检查项 / Checklist
已检查过,当前AllowBalancePay初始化时, 代码已经默认为true, 因此去除gorm默认值不影响原来的业务逻辑
只会减少每次启动时实际的migrate数据库变动日志噪音
Summary by CodeRabbit