// findUserByID 根据 ID 查询用户 funcfindUserByID(id uint) { var user User // First 会根据主键查找,如果找不到会返回 gorm.ErrRecordNotFound result := DB.First(&user, id) // 传入结构体指针和主键值
if result.Error != nil { if result.Error == gorm.ErrRecordNotFound { fmt.Printf("User with ID %d not found.\n", id) } else { fmt.Printf("Error finding user by ID %d: %v\n", id, result.Error) } return } fmt.Printf("Found User by ID %d: Name=%s, Email=%s, Age=%d\n", user.ID, user.Name, user.Email, user.Age) }
// findUserByEmail 根据邮箱查询用户 funcfindUserByEmail(email string) { var user User // Where 方法用于构建查询条件 result := DB.Where("email = ?", email).First(&user) // 使用占位符防止 SQL 注入
if result.Error != nil { if result.Error == gorm.ErrRecordNotFound { fmt.Printf("User with email %s not found.\n", email) } else { fmt.Printf("Error finding user by email %s: %v\n", email, result.Error) } return } fmt.Printf("Found User by Email %s: Name=%s, Age=%d\n", user.Email, user.Name, user.Age) }
// findUsersByName 根据姓名模糊查询所有匹配的用户 funcfindUsersByName(name string) { var users []User // 声明一个结构体切片来存储多条记录 // 使用 LIKE 进行模糊匹配 result := DB.Where("name LIKE ?", "%"+name+"%").Find(&users)
if result.Error != nil { fmt.Printf("Error finding users by name %s: %v\n", name, result.Error) return } iflen(users) == 0 { fmt.Printf("No users found with name containing '%s'.\n", name) return } fmt.Printf("Found %d users with name containing '%s':\n", len(users), name) for _, user := range users { fmt.Printf(" - ID: %d, Name: %s, Email: %s\n", user.ID, user.Name, user.Email) } }
// findUserWithConditions 复杂条件查询 funcfindUserWithConditions() { var user User // 链式调用多个 Where 条件 result := DB.Where("age > ?", 20).Where("name LIKE ?", "%lice%").First(&user)
if result.Error != nil { if result.Error == gorm.ErrRecordNotFound { fmt.Println("No user found with age > 20 and name like '%lice%'.") } else { fmt.Printf("Error finding user with conditions: %v\n", result.Error) } return } fmt.Printf("Found User with conditions: ID=%d, Name=%s, Age=%d\n", user.ID, user.Name, user.Age) }
// updateUserByID 根据 ID 更新用户姓名和邮箱 funcupdateUserByID(id uint, newName, newEmail string) { var user User // 首先找到记录 result := DB.First(&user, id) if result.Error != nil { fmt.Printf("Error finding user ID %d for update: %v\n", id, result.Error) return }
if result.Error != nil { fmt.Printf("Error updating user by email %s: %v\n", email, result.Error) return } if result.RowsAffected == 0 { fmt.Printf("No user found with email %s to update.\n", email) } else { fmt.Printf("Successfully updated user with email %s, Rows Affected: %d\n", email, result.RowsAffected) } }
// incrementUserAge 增加用户年龄 funcincrementUserAge(id uint, delta int) { var user User result := DB.First(&user, id) if result.Error != nil { fmt.Printf("Error finding user ID %d for age increment: %v\n", id, result.Error) return }
result = DB.Model(&user).Update("age", gorm.Expr("age + ?", delta)) // 或者使用 Inc/Dec 方法 (GORM v1.20.0+): // result = DB.Model(&user).Inc("age", delta)
if result.Error != nil { fmt.Printf("Error incrementing age for user ID %d: %v\n", id, result.Error) return } fmt.Printf("Successfully incremented age for user ID %d, Rows Affected: %d\n", id, result.RowsAffected) }
// deleteUserByID 软删除用户 funcdeleteUserByID(id uint) { var user User // 使用 Delete 方法进行软删除 result := DB.Delete(&user, id) // 传入结构体指针和主键值
if result.Error != nil { fmt.Printf("Error soft deleting user ID %d: %v\n", id, result.Error) return } fmt.Printf("Successfully soft deleted user ID %d, Rows Affected: %d\n", id, result.RowsAffected) }
// findDeletedUserByID 查找被软删除的用户 (需要 Unscoped) funcfindDeletedUserByID(id uint) { var user User // 使用 Unscoped() 方法可以查询被软删除的记录 result := DB.Unscoped().First(&user, id)
if result.Error != nil { if result.Error == gorm.ErrRecordNotFound { fmt.Printf("User with ID %d (including deleted) not found.\n", id) } else { fmt.Printf("Error finding deleted user by ID %d: %v\n", id, result.Error) } return } fmt.Printf("Found Deleted User by ID %d: Name=%s, DeletedAt=%s\n", user.ID, user.Name, user.DeletedAt.Format("2006-01-02 15:04:05")) }
使用示例:
1 2 3
deleteUserByID(1) // 软删除 ID 为 1 的用户 findUserByID(1) // 此时应该找不到 ID 为 1 的用户 findDeletedUserByID(1) // 可以找到被软删除的用户
4.2 硬删除 (Permanent Delete)
如果你想彻底从数据库中删除记录,可以使用 Unscoped().Delete()。
1 2 3 4 5 6 7 8 9 10 11 12
// hardDeleteUserByID 硬删除用户 funchardDeleteUserByID(id uint) { var user User // 使用 Unscoped().Delete() 进行硬删除 result := DB.Unscoped().Delete(&user, id)
if result.Error != nil { fmt.Printf("Error hard deleting user ID %d: %v\n", id, result.Error) return } fmt.Printf("Successfully hard deleted user ID %d, Rows Affected: %d\n", id, result.RowsAffected) }