gorm学习及注意事项
实验项目
https://github.com/gofulljs/g_gorm_study
查询注意
- 如果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
- 如果想查询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