首頁 > 軟體

golang gorm模型結構體的定義範例

2022-04-15 19:01:18

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設定為當前時間,並在查詢時無法找到記錄,請參閱[軟刪除]

以上就是golang gorm模型結構體的定義範例的詳細內容,更多關於golang gorm模型結構體的資料請關注it145.com其它相關文章!


IT145.com E-mail:sddin#qq.com