GORM增删改查

一、增

  1. 单:传入实例即可
        user := &User{Name: "XX"}
        db.Create(user)
  2. 列表:
        users := []User{{Name: "xx"},{Name: "XX1"},{Name: "XX2"}}
        db.Create(&users)
  3. 字典
        db.Model(&User{}).Create([]map[string]interface{}{{"Name": "WW" },{"Name":"WW1"}})

    Create还有钩子函数:BeforeSaveBeforeCreateAfterSave、AfterCreate

二、删

  1. 单个删除必须带ID,否则会触发批量删除
        user := User{Name: "XX", ID: 1}
        db.Delete(&user)

    id删除

        db.Delete(&User{}, 2)
  2. 条件删除
    db.Where( "name = ?" , "XX" ).Delete(&user) 
  3. 批量删除
    db.Delete(User{}, "name LIKE ?" , "%xx%" ) 

    删除的钩子函数:BeforeDeleteAfterDelete

三、改

  1. 根据ID更改
        user := User{ID: 3}
        db.Model(&user).Update("name", "test")
        db.Model(&User{}).Where("id=?", 4).Update("name", "test2")

    Model传的是实例,就可以直接操作,传的是结构体本身的话,需要再加条件之后进行操作,当然传的是实例也可以进一步过滤。

  2. 批量更改
        db.Model(&User{}).Where("name LIKE ?", "test").Update("name", "test2")

    更改的钩子函数: BeforeSaveBeforeUpdateAfterSaveAfterUpdate

四、查

    user := User{}
  1. // 获取按主键排序的第一条记录
    db.First(&user)
  2. // 获取最后一条记录,按主键排序 desc
    db.Last(&user)
  3. 根据ID查询:db.First(&user, 10 )
    // SELECT * FROM users WHERE id = 10;
        user := User{}
        fmt.Print(user)
        db.First(&user)
        fmt.Print(user) //查询后的结果
  4. 返回所有数据:
        var user []User
        db.Find(&user)

    也可以添加条件

        var user []User
        db.Find(&user, "id = 3")
        fmt.Print(user)

    也可以用where

    # 写法 1 写死数据
    var user []User //db.Find(&user, "id = 3") db.Where("id = ?", "3").Find(&user) fmt.Print(user)

         
    # 写法2  更灵活
    var user []User //db.Not("id = ?", "3").Find(&user) db.Where(&User{Name: "xx"}).Find(&user) fmt.Print(user)
  5. where的参数是查询的具体条件,但是需要用FInd指明查的哪个库,如果单独用find,第二个参数传的是查询条件,最好使用先where后find这种形式。因为后续有复杂查询,where更适合。

  6. NOT
        var user []User
        db.Not("id = ?", "3").Find(&user)
        fmt.Print(user)
    Not In
    db.Not( map [ string ] interface {}{ "name" : [] string { "xx" , "xx2" }}).Find(&user) 

    In

     db.Where( "name IN ?" , [] string { "xx" , "xx2" }).Find(&users) 

    Not In id_list

    db.Not([] int64 { 1 , 2 , 3 }).Find(&user) 
  7. OR 通常和where一起使用
        var user []User
        db.Where("id", "4").Or("id", "3").Find(&user)
        fmt.Print(user)
        var user []User
        db.Where(&User{ID: 4}).Or(&User{ID: 3}).Find(&user)
        fmt.Print(user)
  8. and
        var user []User
        db.Where("id =? AND name = ?", "3", "test2").Find(&user)
        fmt.Print(user)
        var user []User
        db.Where(map[string]interface{}{"name": "test2", "id":"3"}).Find(&user)
        fmt.Print(user)
  9. 指定具体字段
        var user []User
        db.Select("name").First(&user)
        fmt.Print(user)
  10. 排序
        var user []User
        db.Order("name desc").Find(&user)
        fmt.Print(user)
        var user []User
        db.Order("name desc").Order("id desc").Find(&user)
        fmt.Print(user)
  11. limit 和offset
    db.Limit( 10 ).Offset( 5 ).Find(&user) 
  12. count
        var user []User
        var count int64
        db.Where("name", "test2").Find(&user).Count(&count)
        fmt.Print(user, count)

     过滤字段重复

        var user []User
        var count int64
        db.Where("name", "test2").Distinct("name").Find(&user).Count(&count)
        fmt.Print(user, count)
原文地址:https://www.cnblogs.com/qinghuaL/p/14847750.html