模型
模型定义
什么是模型
模型是标准的 struct,由 Go 的基本数据类型、实现了 Scanner 和 Valuer 接口的自定义类型及其指针或别名组成
人话:一个结构体,携带gorm规定的标签,或者实现了gorm的接口
作用:用模型就可以进行相关数据库的操作,比如说建表,对某个表的增删改查,一对一,一对多关系的联查等,是gorm进行各种操作的基础,一个书写良好的模型会让你对数据库的操作事半功倍
模型的约定
约定:GORM 倾向于约定,而不是配置。默认情况下,GORM 使用 ID 作为主键,使用结构体名的 蛇形复数 作为表名,字段名的 蛇形 作为列名,并使用 CreatedAt、UpdatedAt 字段追踪创建、更新时间
func main() { db, _ := gorm.Open(mysql.New(mysql.Config{DSN: "root:123456@tcp(127.0.0.1:3306)/gormDB?charset=utf8mb4&parseTime=True&loc=Local"}), &gorm.Config{}) type User struct { ID uint Name string Email *string Age uint8 Birthday *time.Time MemberNumber sql.NullString ActivatedAt sql.NullTime CreatedAt time.Time UpdatedAt time.Time } db.AutoMigrate(&User{}) }
GORM 定义一个 gorm.Model 结构体,其包括字段 ID、CreatedAt、UpdatedAt、DeletedAt。
type Model struct { ID uint `gorm:"primarykey"` CreatedAt time.Time UpdatedAt time.Time DeletedAt DeletedAt `gorm:"index"` }
所以上面的模型我们可以修改为
type User struct { gorm.Model //嵌入结构体 Name string Email *string Age uint8 Birthday *time.Time MemberNumber sql.NullString ActivatedAt sql.NullTime }
嵌入结构体
当你有一个公用的结构体想要放入其他结构中的时候只需要以匿名结构体的形式放入它将会自动继承所有字段
type MyModel struct { UUid int } type User struct { gorm.Model MyModel Name string Email *string Age uint8 Birthday *time.Time MemberNumber sql.NullString ActivatedAt sql.NullTime }
如果你不想用匿名结构你可以加入embedded标签让其嵌入
type MyModel struct { UUid int } type User struct { gorm.Model MyModel MyModel `gorm:"embedded"` Name string Email *string Age uint8 Birthday *time.Time MemberNumber sql.NullString ActivatedAt sql.NullTime }
关键标签embeddedPrefix:'前缀’通过这个来区分是不是匿名结构进入的
type User struct { gorm.Model MyModel MyModel `gorm:"embedded;embeddedPrefix:prefix"` Name string Age uint8 }
关键标签
func main() { db, _ := gorm.Open(mysql.New(mysql.Config{DSN: "root:123456@tcp(127.0.0.1:3306)/gormDB?charset=utf8mb4&parseTime=True&loc=Local"}), &gorm.Config{}) db.AutoMigrate(&User{}) } type Model struct { UUID uint `gorm:"primaryKey"` Time time.Time `gorm:"column:my_time"` } type User struct { Model Model `gorm:"embedded;embeddedPrefix:my_"` Name string `gorm:"default:wxf"` Email *string `gorm:"not null"` Age uint8 `gorm:"comment:年龄"` Birthday *time.Time MemberNumber sql.NullString ActivatedAt sql.NullTime }
关联标签
后续会写,现在略过