Skip to main content

创建

// 创建单条记录
user := User{Name: "张三", Email: "zhangsan@example.com", Age: 25}
result := db.Create(&user)

fmt.Println(user.ID)           // 获取自增 ID
fmt.Println(result.Error)      // 错误信息
fmt.Println(result.RowsAffected) // 影响行数

// 批量创建
users := []User{
    {Name: "张三", Email: "zhangsan@example.com"},
    {Name: "李四", Email: "lisi@example.com"},
}
db.Create(&users)

// 指定字段创建
db.Select("Name", "Email").Create(&user)

// 忽略字段创建
db.Omit("Age").Create(&user)

查询

// 查询单条
var user User
db.First(&user)                   // 主键升序第一条
db.First(&user, 10)               // 主键为 10 的记录
db.First(&user, "id = ?", 10)     // 条件查询
db.Last(&user)                    // 主键降序第一条
db.Take(&user)                    // 不排序,取一条

// 查询多条
var users []User
db.Find(&users)                   // 所有记录
db.Find(&users, []int{1, 2, 3})   // 主键在列表中

// 条件查询
db.Where("name = ?", "张三").First(&user)
db.Where("name = ? AND age >= ?", "张三", 18).Find(&users)
db.Where("name IN ?", []string{"张三", "李四"}).Find(&users)
db.Where("name LIKE ?", "%张%").Find(&users)
db.Where("created_at > ?", time.Now().AddDate(0, 0, -7)).Find(&users)

// 结构体条件(零值会被忽略)
db.Where(&User{Name: "张三", Age: 0}).Find(&users)  // 只匹配 name

// Map 条件
db.Where(map[string]interface{}{"name": "张三", "age": 0}).Find(&users)

// Or 条件
db.Where("name = ?", "张三").Or("name = ?", "李四").Find(&users)

// Not 条件
db.Not("name = ?", "张三").Find(&users)

更新

// 更新单个字段
db.Model(&user).Update("name", "王五")

// 更新多个字段
db.Model(&user).Updates(User{Name: "王五", Age: 30})  // 零值不更新
db.Model(&user).Updates(map[string]interface{}{"name": "王五", "age": 0})  // 零值也更新

// 条件更新
db.Model(&User{}).Where("age > ?", 18).Update("status", "adult")

// Select 指定字段更新
db.Model(&user).Select("Name", "Age").Updates(User{Name: "王五", Age: 30})

// Omit 排除字段更新
db.Model(&user).Omit("Age").Updates(User{Name: "王五", Age: 30})

// 表达式更新
db.Model(&user).Update("age", gorm.Expr("age + ?", 1))

删除

// 删除单条
db.Delete(&user)
db.Delete(&user, 10)  // 主键为 10

// 条件删除
db.Where("name = ?", "张三").Delete(&User{})
db.Delete(&User{}, "name = ?", "张三")

// 批量删除
db.Delete(&User{}, []int{1, 2, 3})

// 软删除(需要 DeletedAt 字段)
// 默认使用软删除,记录不会真正删除
db.Delete(&user)  // UPDATE users SET deleted_at = NOW() WHERE id = 1

// 查询包含软删除的记录
db.Unscoped().Find(&users)

// 永久删除
db.Unscoped().Delete(&user)