Golang中使用User ID作为外键批量创建记录失败问题

Golang中使用User ID作为外键批量创建记录失败问题 我有一个用于批量创建用户通话记录的API。我遇到的问题是在CreateInBatches中包含UserID

我的API负载如下:

[
{
    "formatted_number":"+1xxxxxxxx09",
    "cached_matched_number":"+1xxxxxxx09",
},
{
    "formatted_number":"+1xxxxxxxx11",
    "cached_matched_number":"+1xxxxxxx11",
},
{
    "formatted_number":"+1xxxxxxxx10",
    "cached_matched_number":"+1xxxxxxx10"
}]

我希望登录的用户能够一次性保存这些数据。

以下是我的结构体:

type UserCallLog struct {
	ID                  uuid.UUID `gorm:"type:uuid;default:uuid_generate_v4();primaryKey"`
	FormattedNumber     string    `json:"formatted_number"  gorm:"type:varchar(255);index"`
	CachedMatchedNumber string    `json:"cached_matched_number"  gorm:"type:varchar(255);index"`
	UserID              uuid.UUID `json:"user_id" binding:"omitempty,uuid4" gorm:"index"`
	User                User      `gorm:"foreignKey:UserID;references:ID"`
	CreatedAt time.Time
	UpdatedAt time.Time
}

请帮我看看以下代码中的问题:

func CreateCallLogs(c *gin.Context) {
	user_id, _ := c.Get("id")
	var callmetrics []models.UserCallLogMetric
	var err []string
	jsonError := c.ShouldBindJSON(&callmetrics)
	if jsonError != nil {
		err = append(err, utilities.Validate(jsonError)...)
		utilities.ShowError(c, http.StatusBadRequest, err)
		return
	}
	callmetrics.UserID = user_id.(uuid.UUID)
	result :=database.DB.CreateInBatches(callmetrics, 100)
	if result.Error != nil {
		err = append(err, result.Error.Error())
		utilities.ShowError(c, http.StatusBadRequest, err)
		return
	}
	utilities.ShowMessage(c, http.StatusOK, "call logs created successfully")
}

非常感谢您的帮助。


更多关于Golang中使用User ID作为外键批量创建记录失败问题的实战教程也可以访问 https://www.itying.com/category-94-b0.html

2 回复

你遇到的问题在于如何将 UserID 包含在 CreateInBatches 操作中。

你能更具体地说明问题是什么吗?查看你的代码,在我看来它无法编译,因为 var callmetrics []models.UserCallLogMetriccallmetrics 定义为一个切片,但随后你试图在这里设置一个字段:callmetrics.UserID = user_id.(uuid.UUID)。如果你的问题确实是无法编译,在我看来,你需要遍历 callmetrics 中的结构体,并为每一个设置 UserID 字段。如果这不是问题所在,我们需要更多信息。

更多关于Golang中使用User ID作为外键批量创建记录失败问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


问题出在callmetrics.UserID = user_id.(uuid.UUID)这一行。callmetrics是一个切片,不能直接给切片设置字段。你需要遍历切片,为每个元素单独设置UserID

以下是修正后的代码:

func CreateCallLogs(c *gin.Context) {
	userID, _ := c.Get("id")
	var callmetrics []models.UserCallLog
	var err []string
	
	jsonError := c.ShouldBindJSON(&callmetrics)
	if jsonError != nil {
		err = append(err, utilities.Validate(jsonError)...)
		utilities.ShowError(c, http.StatusBadRequest, err)
		return
	}
	
	// 遍历切片,为每个记录设置UserID
	for i := range callmetrics {
		callmetrics[i].UserID = userID.(uuid.UUID)
	}
	
	result := database.DB.CreateInBatches(callmetrics, 100)
	if result.Error != nil {
		err = append(err, result.Error.Error())
		utilities.ShowError(c, http.StatusBadRequest, err)
		return
	}
	
	utilities.ShowMessage(c, http.StatusOK, "call logs created successfully")
}

另外,你的结构体定义中UserCallLogMetric和代码中使用的models.UserCallLog不一致。确保使用正确的结构体名称。如果结构体名确实是UserCallLog,那么代码中应该使用:

type UserCallLog struct {
	ID                  uuid.UUID `gorm:"type:uuid;default:uuid_generate_v4();primaryKey"`
	FormattedNumber     string    `json:"formatted_number" gorm:"type:varchar(255);index"`
	CachedMatchedNumber string    `json:"cached_matched_number" gorm:"type:varchar(255);index"`
	UserID              uuid.UUID `json:"user_id" gorm:"index"`
	User                User      `gorm:"foreignKey:UserID;references:ID"`
	CreatedAt           time.Time
	UpdatedAt           time.Time
}

注意:移除了binding:"omitempty,uuid4"标签,因为UserID应该从上下文中获取,而不是从JSON负载中解析。

回到顶部