Skip to content

gorm学习及注意事项

实验项目

https://github.com/gofulljs/g_gorm_study

查询注意

  1. 如果model中有主键, gorm 如果使用了 model、take、first、last均会产生对应条件(只要结构体中对应字段为非零值),
info := &model.Userinfos{
    Class: "一一班",
    No:    3,
}

err := model.DB.Take(info).Error

产生sql

SELECT * FROM `userinfos` WHERE `userinfos`.`class` = '一一班' AND `userinfos`.`no` = 3 LIMIT 1
  1. 如果想查询info中一个字段为条件,又不受主键影响,有两种方式

如下只希望获取一一班中的一个学生,但info中有其他值

方式一: 使用table方法+scan方法

info := &model.Userinfos{
        Class: "一一班",
        No:    4,
    }

err := model.DB.Table(info.TableName()).Where("class = ?", info.Class).Scan(info).Error
// 或
err := model.DB.Table(info.TableName()).Where(info, model.UserinfosColumns.Class).Scan(info).Error

方式二: model中使用只带查询字段的新结构体,缺点就是不能重复利用前面的结构体了,会多消耗点资源

info := &model.Userinfos{
    Class: "一一班",
    No:    4,
}

// 如果此处查询非主键作为条件就只能用Where 的方式

err := model.DB.Model(&model.Userinfos{Class: info.Class}).Scan(info).Error
// or
err := model.DB.Model(&model.Userinfos{}).Where(info, model.UserinfosColumns.Class).Scan(info).Error
// or 
err := model.DB.Model(&model.Userinfos{}).Where("class = ?", info.Class).Scan(info).Error

Comments