提问人:siderra 提问时间:11/9/2023 更新时间:11/9/2023 访问量:25
如果存在,则使 gorm 添加值,如果插入到 db 时没有值,则忽略它
Make gorm add value if exists and ignore it if no value on insert to db
问:
我正在使用 go 和 gorm 编写一个 API 。我的数据库中有一列 - call_id ,这是一个外键。但它是可为 null 的(这意味着它接受 null 作为值)。我有一个用于创建调查响应的结构,它有 CallID 作为其字段之一。我希望能够创建一个调查响应,无论结构是否call_id(json 上不需要它,它是空的)。但是当我尝试从有效负载中省略 call_id 时,它被赋予默认值 0,这在 db 中不被接受,因为它是一个外键。ERROR: insert or update on table "survey_responses" violates foreign key constraint "survey_responses_call_id_fkey" (SQLSTATE 23503) INSERT INTO "survey_responses" ("survey_question_id","answer","contact_id","created_at","updated_at","call_id") VALUES (34,'1000',26,'2023-11-09 13:54:58.221','2023-11-09 13:54:58.221',0)
这是我的模型
type SurveyResponses struct {
ID uint `json:"id" gorm:"column:id"`
SurveyQuestionID uint `json:"survey_question_id" gorm:"column:survey_question_id" binding:"required"`
Response string `json:"answer" gorm:"column:answer" binding:"required"`
ContactID uint `json:"contact_id" gorm:"column:contact_id" binding:"required"`
CreatedAt time.Time `json:"created_at" gorm:"column:created_at;autoCreateTime"`
UpdatedAt time.Time `json:"updated_at" gorm:"column:updated_at;autoUpdateTime"`
CallID uint `json:"call_id" gorm:"column:call_id"`}
这是我的API
func SubmitSurveyResponses(ctx *gin.Context) {
responses := []models.SurveyResponses{}
if err := ctx.ShouldBindJSON(&responses); err != nil {
if invalid, err := utils.ModelValidationResponse(err); err == nil {
ctx.AbortWithStatusJSON(http.StatusBadRequest, invalid)
return
}
logrus.Error(err)
ctx.AbortWithStatusJSON(http.StatusBadRequest, gin.H{"errors": []string{err.Error()}})
return
}
// for i, response := range responses {
// if response.CallID == 0 {
// responses[i].CallID = 1
// }
// }
err := models.SurveyResponsesSaveBatch(&responses)
if err != nil {
logrus.Error(err)
ctx.AbortWithStatusJSON(http.StatusBadRequest, gin.H{"errors": []string{err.Error()}})
return
}
ctx.AbortWithStatusJSON(http.StatusCreated, responses)
}
我尝试像这样在这一行之前强制 nil(因为该字段接受 null 值)。但是我得到(不能在赋值中使用 nil 作为 uint 值)。我需要这方面的帮助。
for i, response := range responses {
if response.CallID == 0 {
responses[i].CallID = nil
}
}
err := models.SurveyResponsesSaveBatch(&responses)
答: 暂无答案
评论
uint
json:"call_id" gorm:"column:call_id"
* allows to assign nil