如何通过GORM更新数组字段?解决类型不匹配报错问题
解决GORM更新BigQuery数组字段的类型不匹配错误
错误原因
触发的Value of type STRUCT<INT64, INT64> cannot be assigned to pets错误,本质是GORM处理[]string类型时,未正确映射到BigQuery的ARRAY<STRING>类型,反而错误将其转换为结构体类型,导致数据库类型不匹配。
解决方案
1. 直接执行原生SQL更新
绕开ORM的自动转换逻辑,通过Exec方法执行原生BigQuery SQL,确保数组参数被正确传递:
bqStore.DB.Exec("UPDATE `project-id.dataset-id.people` SET pets = ? WHERE id = ?", pets, 1)
2. 升级GORM BigQuery驱动
该问题可能是旧版本驱动的类型映射bug,升级到最新版本修复问题:
go get gorm.io/driver/bigquery@latest
3. 用结构体/Map包装更新数据
通过Updates方法传递Map或临时结构体,让GORM更准确识别字段类型:
- 使用Map:
bqStore.DB.Model(&Person{}).Where("id = ?", 1).Updates(map[string]interface{}{"pets": pets})
- 使用临时结构体:
updatePayload := struct { Pets []string `gorm:"column:pets"` }{Pets: pets} bqStore.DB.Model(&Person{}).Where("id = ?", 1).Updates(updatePayload)
内容的提问来源于stack exchange,提问作者Deqing
相关产品推荐
相关产品推荐

