建立结构体时可以通过 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 约定使用 CreatedAt、UpdatedAt 追踪创建/更新时间。如果你定义了这种字段,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;"`
}