网络编程
位置:首页>> 网络编程>> Go语言>> golang gorm模型结构体的定义示例

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,包括字段IDCreatedAtUpdatedAtDeletedAt,你可以将它嵌入你的模型,或者只写你想要的字段

// 基本模型的定义
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
投稿

猜你喜欢

手机版 网络编程 asp之家 www.aspxhome.com