golang gorm模型结构体的定义示例
作者:Jeff的技术栈 发布时间:2024-04-23 09:35:24
标签:golang,gorm,模型,结构体
1. 模型
1.1. 模型定义
type User struct {
gorm.Model
Birthday time.Time
Age int
Name string `gorm:"size:255"` // string默认长度为255, 使用这种tag重设。
Num int `gorm:"AUTO_INCREMENT"` // 自增
CreditCard CreditCard // One-To-One (拥有一个 - CreditCard表的UserID作外键)
Emails []Email // One-To-Many (拥有多个 - Email表的UserID作外键
BillingAddress Address // One-To-One (属于 - 本表的BillingAddressID作外键)
BillingAddressID sql.NullInt64
ShippingAddress Address // One-To-One (属于 - 本表的ShippingAddressID作外键)
ShippingAddressID int
IgnoreMe int `gorm:"-"` // 忽略这个字段
Languages []Language `gorm:"many2many:user_languages;"` // Many-To-Many , 'user_languages'是连接表
}
type Email struct {
ID int
UserID int `gorm:"index"` // 外键 (属于), tag `index`是为该列创建索引
Email string `gorm:"type:varchar(100);unique_index"` // `type`设置sql类型, `unique_index` 为该列设置唯一索引
Subscribed bool
}
type Address struct {
ID int
Address1 string `gorm:"not null;unique"` // 设置字段为非空并唯一
Address2 string `gorm:"type:varchar(100);unique"`
Post sql.NullString `gorm:"not null"`
}
type Language struct {
ID int
Name string `gorm:"index:idx_name_code"` // 创建索引并命名,如果找到其他相同名称的索引则创建组合索引
Code string `gorm:"index:idx_name_code"` // `unique_index` also works
}
type CreditCard struct {
gorm.Model
UserID uint
Number string
}
2. 约定
2.1. gorm.Model 结构体
基本模型定义gorm.Model
,包括字段ID
,CreatedAt
,UpdatedAt
,DeletedAt
,你可以将它嵌入你的模型,或者只写你想要的字段
// 基本模型的定义
type Model struct {
ID uint `gorm:"primary_key"`
CreatedAt time.Time
UpdatedAt time.Time
DeletedAt *time.Time
}
// 添加字段 `ID`, `CreatedAt`, `UpdatedAt`, `DeletedAt`
type User struct {
gorm.Model
Name string
}
// 只需要字段 `ID`, `CreatedAt`
type User struct {
ID uint
CreatedAt time.Time
Name string
}
2.2. 表名是结构体名称的复数形式
type User struct {} // 默认表名是`users`
// 设置User的表名为`profiles`
func (User) TableName() string {
return "profiles"
}
func (u User) TableName() string {
if u.Role == "admin" {
return "admin_users"
} else {
return "users"
}
}
// 全局禁用表名复数
db.SingularTable(true) // 如果设置为true,`User`的默认表名为`user`,使用`TableName`设置的表名不受影响
2.3. 更改默认表名
您可以通过定义DefaultTableNameHandler
对默认表名应用任何规则。
gorm.DefaultTableNameHandler = func (db *gorm.DB, defaultTableName string) string {
return "prefix_" + defaultTableName;
}
2.4. 列名是字段名的蛇形小写
type User struct {
ID uint // 列名为 `id`
Name string // 列名为 `name`
Birthday time.Time // 列名为 `birthday`
CreatedAt time.Time // 列名为 `created_at`
}
// 重设列名
type Animal struct {
AnimalId int64 `gorm:"column:beast_id"` // 设置列名为`beast_id`
Birthday time.Time `gorm:"column:day_of_the_beast"` // 设置列名为`day_of_the_beast`
Age int64 `gorm:"column:age_of_the_beast"` // 设置列名为`age_of_the_beast`
}
2.5. 字段ID为主键
type User struct {
ID uint // 字段`ID`为默认主键
Name string
}
// 使用tag`primary_key`用来设置主键
type Animal struct {
AnimalId int64 `gorm:"primary_key"` // 设置AnimalId为主键
Name string
Age int64
}
2.6. 字段CreatedAt用于存储记录的创建时间
创建具有CreatedAt
字段的记录将被设置为当前时间
db.Create(&user) // 将会设置`CreatedAt`为当前时间
// 要更改它的值, 你需要使用`Update`
db.Model(&user).Update("CreatedAt", time.Now())
2.7. 字段UpdatedAt用于存储记录的修改时间
保存具有UpdatedAt
字段的记录将被设置为当前时间
db.Save(&user) // 将会设置`UpdatedAt`为当前时间
db.Model(&user).Update("name", "jinzhu") // 将会设置`UpdatedAt`为当前时间
2.8. 字段DeletedAt用于存储记录的删除时间,如果字段存在
删除具有DeletedAt
字段的记录,它不会冲数据库中删除,但只将字段DeletedAt
设置为当前时间,并在查询时无法找到记录,请参阅[软删除]
来源:https://www.cnblogs.com/guyouyin123/p/14109877.html
0
投稿
猜你喜欢
- 除了使用pycharm外,还可使用vscode来操作pyqt,方法如下:1. 在vscode中配置相关的pyqt的相关根据自己实际情况修改第
- MySQL时间盲注五种延时方法 (PWNHUB 非预期解)延时注入函数五种:sleep(),benchmark(t,exp),笛卡尔积,GE
- 本文实例讲述了JavaScript设计模式之享元模式。分享给大家供大家参考,具体如下:通过两个例子的对比来凸显享元模式的特点:享元模式是一个
- 手动备份1)cmd控制台:mysqldump -uroot -proot 数据库名 [表名1,表名2...] > 文件路径比如:把 d
- 由于多种原因,进行安全设置的人们常常不理解数据的真正价值,所以,他们也无法对数据进行合适的保护。将你的数据只限于需要的人访问,并保证访问的人
- 一:最近,经常碰到有网友问,如何使vbscript和javascipt传递变量。不知道为什么要这么做。因为每一种脚本语言几乎都可以完成所需要
- 对于有的vps,系统默认安装了mysql。我们需要从我们的服务器、vps上卸载(移除)默认的mysql。那么如何(怎样)在ubuntu\De
- 一、简介是一个 python 内置包,不需要额外安装即可使用urllib 是 Python 标准库中用于网络请求的库,内置四个模块,分别是u
- <script>alert(escape("人"));alert(encodeURI("人&quo
- 本文实例为大家分享了js判断密码强度的具体代码,供大家参考,具体内容如下<!DOCTYPE html><html>&
- 前言Python的异常处理能力非常强大,但是用不好也会带来负面的影响。我平时写程序的过程中也喜欢使用异常,虽然采取防御性的方式编码会更好,但
- 背景:之前写的接口测试一直没有支持无限嵌套对比key,上次testerhome逛论坛,有人分享了他的框架,看了一下,有些地方不合适我这边自己
- 使用叹号(!)禁止用户终端进入的一个方法。mysql> grant all privileges on wubx.* to ‘wubx
- go和golang之间有区别吗?go和golang之间没有区别,go就是golang,全名是golang,简称go语言。Go(又称 Gola
- 介绍Python常见的字符串处理方式字符串截取 >>>s = 'hello'>>>s[0
- xml文件:country.xml<data><country name="shdi2hajk">
- 上传问题可以说是网络编程中经常遇到的,也是一个很重要的问题,我们不仅要实现上传文件,图片等基本功能,还有考虑到上传程序的安全性,本文介绍了一
- 1、使用ImageField先安装pillow模块pip install pillow2、在app的models中设置class Image
- 有向无环图拓扑排序是针对有向无环图(DAG, Directed Acyclic Graph)的具有以下性质:如果这个图不是 DAG,那么它是
- OCR of Hand-written Data using kNNOCR of Hand-written Digits我们的目标是构建一个