https://learnku.com/docs/gorm/v2/models/9729

模型是标准的 struct,由 Go 的基本数据类型、实现了 ScannerValuer 接口的自定义类型及其指针或别名组成

type User struct {<br />
&nbsp; ID&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; uint<br />
&nbsp; Name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string<br />
&nbsp; Email&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *string<br />
&nbsp; Age&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; uint8<br />
&nbsp; Birthday&nbsp;&nbsp;&nbsp;&nbsp; *time.Time<br />
&nbsp; MemberNumber sql.NullString<br />
&nbsp; ActivedAt&nbsp;&nbsp;&nbsp; sql.NullTime<br />
&nbsp; CreatedAt&nbsp;&nbsp;&nbsp; time.Time<br />
&nbsp; UpdatedAt&nbsp;&nbsp;&nbsp; time.Time<br />
}

GORM 定义一个

gorm.Model
结构体,其包括字段
ID
CreatedAt
UpdatedAt
DeletedAt

// gorm.Model 的定义<br />
type Model struct {<br />
&nbsp; ID&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; uint&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; `gorm:&quot;primaryKey&quot;`<br />
&nbsp; CreatedAt time.Time<br />
&nbsp; UpdatedAt time.Time<br />
&nbsp; DeletedAt gorm.DeletedAt `gorm:&quot;index&quot;`<br />
}

嵌入结构体

对于匿名字段,GORM 会将其字段包含在父结构体中,例如:

字段级权限控制

type User struct {<br />
&nbsp; gorm.Model<br />
&nbsp; Name string<br />
}<br />
// 等效于<br />
type User struct {<br />
&nbsp; ID&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; uint&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; `gorm:&quot;primaryKey&quot;`<br />
&nbsp; CreatedAt time.Time<br />
&nbsp; UpdatedAt time.Time<br />
&nbsp; DeletedAt gorm.DeletedAt `gorm:&quot;index&quot;`<br />
&nbsp; Name string<br />
}

对于正常的结构体字段,你也可以通过标签

embedded
将其嵌入,例如:

type Author struct {<br />
&nbsp;&nbsp;&nbsp; Name&nbsp; string<br />
&nbsp;&nbsp;&nbsp; Email string<br />
}

</p>

type Blog struct {<br />
&nbsp; ID&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int<br />
&nbsp; Author&nbsp; Author `gorm:&quot;embedded&quot;`<br />
&nbsp; Upvotes int32<br />
}<br />
// 等效于<br />
type Blog struct {<br />
&nbsp; ID&nbsp;&nbsp;&nbsp; int64<br />
&nbsp;&nbsp;&nbsp; Name&nbsp; string<br />
&nbsp;&nbsp;&nbsp; Email string<br />
&nbsp; Upvotes&nbsp; int32<br />
}

可以使用标签

embeddedPrefix
来为 db 中的字段名添加前缀,例如:

type Blog struct {<br />
&nbsp; ID&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int<br />
&nbsp; Author&nbsp; Author `gorm:&quot;embedded;embeddedPrefix:author_&quot;`<br />
&nbsp; Upvotes int32<br />
}<br />
// 等效于<br />
type Blog struct {<br />
&nbsp; ID&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int64<br />
&nbsp;&nbsp;&nbsp; AuthorName&nbsp; string<br />
&nbsp;&nbsp;&nbsp; AuthorEmail string<br />
&nbsp; Upvotes&nbsp;&nbsp;&nbsp;&nbsp; int32<br />
}

可导出的字段在使用 GORM 进行 CRUD 时拥有全部的权限,此外,GORM 允许您用标签控制字段级别的权限。这样您就可以让一个字段的权限是只读、只写、只创建、只更新或者被忽略

    注意: 使用 GORM Migrator 创建表时,不会创建被忽略的字段

type User struct {<br />
&nbsp; Name string `gorm:&quot;&lt;-:create&quot;` // 允许读和创建<br />
&nbsp; Name string `gorm:&quot;&lt;-:update&quot;` // 允许读和更新<br />
&nbsp; Name string `gorm:&quot;&lt;-&quot;`&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 允许读和写(创建和更新)<br />
&nbsp; Name string `gorm:&quot;&lt;-:false&quot;`&nbsp; // 允许读,禁止写<br />
&nbsp; Name string `gorm:&quot;-&gt;&quot;`&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 只读(除非有自定义配置,否则禁止写)<br />
&nbsp; Name string `gorm:&quot;-&gt;;&lt;-:create&quot;` // 允许读和写<br />
&nbsp; Name string `gorm:&quot;-&gt;:false;&lt;-:create&quot;` // 仅创建(禁止从 db 读)<br />
&nbsp; Name string `gorm:&quot;-&quot;`&nbsp; // 读写操作均会忽略该字段<br />
}

创建 / 更新时间追踪(纳秒、毫秒、秒、Time)

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

要使用不同名称的字段,您可以配置 autoCreateTim、autoUpdateTim 标签

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

type User struct {<br />
&nbsp; CreatedAt time.Time // 在创建时,如果该字段值为零值,则使用当前时间填充<br />
&nbsp; UpdatedAt int&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 在创建时该字段值为零值或者在更新时,使用当前时间戳秒数填充<br />
&nbsp; Updated&nbsp;&nbsp; int64 `gorm:&quot;autoUpdateTime:nano&quot;` // 使用时间戳填纳秒数充更新时间<br />
&nbsp; Updated&nbsp;&nbsp; int64 `gorm:&quot;autoUpdateTime:milli&quot;` // 使用时间戳毫秒数填充更新时间<br />
&nbsp; Created&nbsp;&nbsp; int64 `gorm:&quot;autoCreateTime&quot;`&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 使用时间戳秒数填充创建时间<br />
}