ForeignKey
gorm model struct中定义外键字段后,如果dialect是mysql,那么使用AutoMigrate
生成表时候不会自动生成外键。参考见GitHub issue
1 | type ChargingHistory struct { |
所以如果需要使用model生成外键,候需要使用AddForeignKey
语句生成外键
1 | db.AutoMigrate( |
Query
使用First,Find查询默认会根据主键查询,另外如果有deleted_at字段,会默认过滤掉deleted_at不为空的记录
1 | func (u *MobileUser) Get(db igorm.Gormw) (*MobileUser, error) { |
当使用First查询数据库时候,如果主键为空,那么就取全部数据中的第一条记录返回。
1 | func (e *ElectricVehicle) Get(db igorm.Gormw) (*ElectricVehicle, error) { |
定义与生成联合索引
使用struct定义联合索引时候,需要注意联合索引的先后排序顺序,因此需要把主排序索引列放到model struct结构体中其他次要排序索引列的前面。
例如如下idx_user_charger联合索引把MobileUserId列声明在ChargerId列前面。然后在AutoMigrate时候gorm会帮助自动生成联合索引
1 | type PrivateCharger struct { |
Save
在Gorm中使用Save时候,如果没有主键字段,那么会创建一条新纪录,依赖于数据库自动生成主键;如果有主键字段,那么会经过update -> select -> insert三个阶段。
先是尝试着根据条件更新数据库记录,如果更新失败那么再执行FirstOrCreate
方法;FirstOrCreate就是先根据条件查询,如果存在返回数据库中记录,如果不存在,就创建一条新纪录。
我们系统中主键id是由程序生成,而不是数据库自动创建的。以下方法用于设置默认车的功能,在新建和修改的时候都可以使用。
1 | func (e *ElectricVehicle) SetDefault(db igorm.Gormw, userId string) error { |