You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GORM一对多关联Create时处理INSERT ON CONFLICT(SQLSTATE23505)问题

解决GORM关联创建时双表ON CONFLICT DO NOTHING的问题

要实现单个Create语句同时处理OHLCV和Calculation两张表的冲突忽略,需要给两张表分别指定ON CONFLICT DO NOTHING的子句,核心是利用GORM的clause.OnConflict并显式指定关联表的表名。

解决方案代码

err = db.Clauses(
    // 处理OHLCV主表的冲突
    clause.OnConflict{
        DoNothing: true,
        Columns: []clause.Column{
            {Name: "interval"},
            {Name: "pair"},
            {Name: "open_time"},
            {Name: "close_time"},
        },
    },
    // 处理Calculation关联表的冲突
    clause.OnConflict{
        Table: clause.Table{Name: "calculations"}, // 必须显式指定关联表名
        DoNothing: true,
        Columns: []clause.Column{
            {Name: "ohlcv_refer"},
            {Name: "key"},
            {Name: "config"},
        },
    },
).Create(ohlcvs).Error

原理说明

  • 主表OHLCV的冲突处理逻辑和你之前的代码一致,通过指定唯一索引的列来触发DO NOTHING
  • 关联表Calculation需要额外添加一个OnConflict子句,必须显式指定表名(否则GORM会默认使用主表表名),同时指定它的唯一索引列ohlcv_refer、key、config,这样插入关联数据时遇到重复就会忽略
  • GORM在执行Create操作时,会将所有的OnConflict子句应用到对应的表上,实现双表的冲突忽略

注意事项

  • 确保关联表的表名calculations和GORM自动生成的表名一致(如果没有自定义表名,GORM会将结构体名转为复数小写)
  • 唯一索引的列名要和数据库中的实际列名一致(比如OhlcvRefer对应数据库的ohlcv_refer)

内容的提问来源于stack exchange,提问作者koutlaas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 17:10:36