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
相关产品推荐
相关产品推荐

