在 GORM 中,FirstOrCreate 和 FirstOrInit 方法都可以用来检索或创建数据库记录。但是,确定记录是新创建还是更新可能不清楚。
使用 Upsert-On-Conflict 的 Upsert 解决方案
从 GORM 1.20.x 开始,增强的引入了 Upsert 功能,该功能利用各种数据库的冲突处理功能。
// Update columns when conflict on id DB.Clauses(clause.OnConflict{ Columns: []clause.Column{{Name: "id"}}, DoUpdates: clause.AssignmentColumns([]string{"name", "age"}), }).Create(&users)
此代码段转换为 SQL 语句,例如:
旧版 GORM 的后备解决方案版本
对于 1.9.x 之前的 GORM 版本,更有效的方法是先尝试更新,如果没有找到匹配则创建新记录。
// Update only set name=nick if err := db.Model(&newUser).Where("id = ?", 3333).Update("name", "nick").Error; err != nil { // Handle error... if gorm.IsRecordNotFoundError(err) { db.Create(&newUser) // Create new record from newUser } }
区分 FirstOrInit 和 FirstOrCreate
虽然这两种方法具有相似的目的,但它们的行为是不同的:
以上是与 FirstOrCreate 和 FirstOrInit 相比,GORM 的 Upsert 功能如何工作?的详细内容。更多信息请关注PHP中文网其他相关文章!