golang学习笔记(3)-gorm声明模型

gorm声明模型

本文多转自gorm官方文档

模型定义

模型是标准的struct,由go的基本数据类型,实现了Scanner和Valuer接口的自定义类型及其指针或别名的组成
例如:

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
}

个人理解模型是数据库与对象的一个映射,结构体名与表名对应,字段名与列名对应,各字段值与各列值对应,通过此模型来实现orm方法。

约定

GORM 倾向于约定,而不是配置。默认情况下,GORM 使用 ID 作为主键,使用结构体名的 蛇形复数 作为表名,字段名的 蛇形 作为列名,并使用 CreatedAt、UpdatedAt 字段追踪创建、更新时间

遵循 GORM 已有的约定,可以减少您的配置和代码量。如果约定不符合您的需求,GORM 允许您自定义配置它们


个人理解:蛇形复数为在名法中,各个单词之间通过下划线“_”连接,比如test_tb1。若末尾不是数字结尾,模型会自动添加s。在此约定下,结构名若为TestTb2这种大驼峰命名法时,创建的表名则为test_tb2 ,同样的字段名为UserName时创建的列名则为user_name。因此建议模型命名应当符合驼峰命名法。

gorm.Model

GORM 定义一个 gorm.Model 结构体,其包括字段 ID、CreatedAt、UpdatedAt、DeletedAt

// gorm.Model 的定义
type Model struct {
  ID        uint           `gorm:"primaryKey"`
  CreatedAt time.Time
  UpdatedAt time.Time
  DeletedAt gorm.DeletedAt `gorm:"index"`
}

利用时只需要嵌套在自己声明的模型里即可。
列如

type TestTb2 struct {
	gorm.Model
	Id       int
	Username string
	Password string
}

含有Model结构体的模型在经行删除操作时,是经行软删除,删除之后数据依旧存在于数据库,但不会被查找出来。含有Model结构体的模型经行查找时会判断DeletedAt是否为null。

高级选项

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

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

type User struct {
  Name string `gorm:"<-:create"` // 允许读和创建
  Name string `gorm:"<-:update"` // 允许读和更新
  Name string `gorm:"<-"`        // 允许读和写(创建和更新)
  Name string `gorm:"<-:false"`  // 允许读,禁止写
  Name string `gorm:"->"`        // 只读(除非有自定义配置,否则禁止写)
  Name string `gorm:"->;<-:create"` // 允许读和写
  Name string `gorm:"->:false;<-:create"` // 仅创建,禁止从db读
  Name string `gorm:"-"`            // 通过struct读写会忽略该字段
  Name string `gorm:"-:all"`        // 写入、读取和迁移结构时,忽略这个字段。
  Name string `gorm:"-:migration"`  // 迁移时忽略这个字段
}

字段标签

声明 model 时,tag 是可选的,GORM 支持以下 tag: tag 名大小写不敏感,但建议使用 风格camelCase

标签名说明
column指定 db 列名
type列数据类型,推荐使用兼容性好的通用类型,例如:所有数据库都支持 bool、int、uint、float、string、time、bytes 并且可以和其他标签一起使用,例如:、, … 像 这样指定数据库数据类型也是支持的。在使用指定数据库数据类型时,它需要是完整的数据库数据类型,如:not null,size,autoIncrement,varbinary(8),MEDIUMINT UNSIGNED not NULL AUTO_INCREMENT
size指定列大小
primaryKey指定为主键
unique指定列为唯一
default指定列的默认值
precision指定列的精度
scale指定列大小
not null指定列不为空
autoIncrement指定列为自增长
embedded嵌套字段
embeddedPrefix嵌套字段的列名前缀
index使用选项创建索引,对多个字段使用相同的名称,创建复合索引
uniqueIndex与index相同,但创建的是唯一索引
check创建约束条件
<-设置字段写入的权限,<-:create只创建,<-:update只更新,<-:false无写权限,<-创建与更新的权限
->设置字段读的权限,->:false无读权限
-忽略该字段,-无读写权限
comment迁移时为字段添加注解

还要一些关联标签,在关联学习时写出

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值