Gorm踩过的坑 | 青训营笔记

307 阅读2分钟

建立结构体时可以通过 TableName来指定要查找的表名

Gorm很坑的一点是它查找表名是直接在结构体后面加s,这就很抽象了,因为有些英文单词复数并不是直接在单词后面加s,这个时候就要重构一下这个方法。

func (CoinLog) TableName() string {return "coin_log"}

Updates是根据主键来查询,并不会根据外键来自动更新

如果你不在主键里定义主键标签,那么gorm就会提示你"Where condition required",这里注意,如果没写标签的话,gorm默认是以结构体里的ID字段为主键来进行查询,如果用updates进行has many复杂结构体更新,一定记得把另一个结构体的主键数据也一并提交上去,不然就会检测不到相同数据,又往里面加入新的一条,其实这一点我觉得Java的Mybatis就很好,它的update函数是update by id,这种命名方式就很好,不会引起误解,不然我一直以为它很智能,能只能检测哪些字段改变了哪些没改变。

日期字段时间类型设置

GORM 约定使用 CreatedAtUpdatedAt 追踪创建/更新时间。如果你定义了这种字段,GORM 在创建、更新时会自动填充。

如果想要保存 UNIX(毫/纳)秒时间戳而不是 time,只需简单地将 time.Time 修改为 int 即可:

gorm查询时一定要记得在结构体标签里面定义外键和来源

preload联表查询性能应该没有join好,因为preload相当于在两个表里面查询了两遍,而join是将两个表合成一个表再进行查询

可以定义MarshalBinary和UnmarshalBinary函数来让一些库序列化结构体

最后贴一下我自己的结构体代码

type Will struct {  
ID int `gorm:"primaryKey"`  
StudentID string `json:"studentID"`  
Organization string `json:"organization" `  
Department string `json:"department" `  
Reason string `json:"reason" `  
}  
  
type Registration struct {  
ID int `gorm:"primaryKey"` //这个ID没用,只是设为主键为了方便在数据库中记录,json不需要填写  
StudentID string `json:"studentID" binding:"required"`
Name string `json:"name" binding:"required"`  
Major string `json:"major" binding:"required"`  
ClassName string `json:"className" binding:"required" `  
QQ string `json:"qq" binding:"required"`  
Phone string `json:"phone" binding:"required"`  
IsDispensing bool `json:"isdispensing" `  
Wills []Will `json:"wills" gorm:"ForeignKey:StudentID;references:StudentID;"`  
}