如果存在,则使 gorm 添加值,如果插入到 db 时没有值,则忽略它

Make gorm add value if exists and ignore it if no value on insert to db

提问人:siderra 提问时间:11/9/2023 更新时间:11/9/2023 访问量:25

问:

我正在使用 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)
去戈姆

评论

1赞 Ali Özen 11/9/2023
我不太了解 GoLang,但看起来它不接受 null。您可以在 In CallID 行之前加上 *。“CallID *uint ”试一试。uintjson:"call_id" gorm:"column:call_id"
0赞 siderra 11/10/2023
谢谢。这成功了.你能进一步解释一下吗?
0赞 Ali Özen 11/10/2023
我很高兴听到这个消息。我真的无法解释。我是围棋新手。我只知道.* allows to assign nil

答: 暂无答案