golang?gorm模型結(jié)構(gòu)體的定義示例
1. 模型
1.1. 模型定義
type User struct { gorm.Model Birthday time.Time Age int Name string `gorm:"size:255"` // string默認(rèn)長(zhǎng)度為255, 使用這種tag重設(shè)。 Num int `gorm:"AUTO_INCREMENT"` // 自增 CreditCard CreditCard // One-To-One (擁有一個(gè) - CreditCard表的UserID作外鍵) Emails []Email // One-To-Many (擁有多個(gè) - Email表的UserID作外鍵 BillingAddress Address // One-To-One (屬于 - 本表的BillingAddressID作外鍵) BillingAddressID sql.NullInt64 ShippingAddress Address // One-To-One (屬于 - 本表的ShippingAddressID作外鍵) ShippingAddressID int IgnoreMe int `gorm:"-"` // 忽略這個(gè)字段 Languages []Language `gorm:"many2many:user_languages;"` // Many-To-Many , 'user_languages'是連接表 } type Email struct { ID int UserID int `gorm:"index"` // 外鍵 (屬于), tag `index`是為該列創(chuàng)建索引 Email string `gorm:"type:varchar(100);unique_index"` // `type`設(shè)置sql類(lèi)型, `unique_index` 為該列設(shè)置唯一索引 Subscribed bool } type Address struct { ID int Address1 string `gorm:"not null;unique"` // 設(shè)置字段為非空并唯一 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"` // 創(chuàng)建索引并命名,如果找到其他相同名稱(chēng)的索引則創(chuàng)建組合索引 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 結(jié)構(gòu)體
基本模型定義gorm.Model
,包括字段ID
,CreatedAt
,UpdatedAt
,DeletedAt
,你可以將它嵌入你的模型,或者只寫(xiě)你想要的字段
// 基本模型的定義 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. 表名是結(jié)構(gòu)體名稱(chēng)的復(fù)數(shù)形式
type User struct {} // 默認(rèn)表名是`users` // 設(shè)置User的表名為`profiles` func (User) TableName() string { return "profiles" } func (u User) TableName() string { if u.Role == "admin" { return "admin_users" } else { return "users" } } // 全局禁用表名復(fù)數(shù) db.SingularTable(true) // 如果設(shè)置為true,`User`的默認(rèn)表名為`user`,使用`TableName`設(shè)置的表名不受影響
2.3. 更改默認(rèn)表名
您可以通過(guò)定義DefaultTableNameHandler
對(duì)默認(rèn)表名應(yīng)用任何規(guī)則。
gorm.DefaultTableNameHandler = func (db *gorm.DB, defaultTableName string) string { return "prefix_" + defaultTableName; }
2.4. 列名是字段名的蛇形小寫(xiě)
type User struct { ID uint // 列名為 `id` Name string // 列名為 `name` Birthday time.Time // 列名為 `birthday` CreatedAt time.Time // 列名為 `created_at` } // 重設(shè)列名 type Animal struct { AnimalId int64 `gorm:"column:beast_id"` // 設(shè)置列名為`beast_id` Birthday time.Time `gorm:"column:day_of_the_beast"` // 設(shè)置列名為`day_of_the_beast` Age int64 `gorm:"column:age_of_the_beast"` // 設(shè)置列名為`age_of_the_beast` }
2.5. 字段ID為主鍵
type User struct { ID uint // 字段`ID`為默認(rèn)主鍵 Name string } // 使用tag`primary_key`用來(lái)設(shè)置主鍵 type Animal struct { AnimalId int64 `gorm:"primary_key"` // 設(shè)置AnimalId為主鍵 Name string Age int64 }
2.6. 字段CreatedAt用于存儲(chǔ)記錄的創(chuàng)建時(shí)間
創(chuàng)建具有CreatedAt
字段的記錄將被設(shè)置為當(dāng)前時(shí)間
db.Create(&user) // 將會(huì)設(shè)置`CreatedAt`為當(dāng)前時(shí)間 // 要更改它的值, 你需要使用`Update` db.Model(&user).Update("CreatedAt", time.Now())
2.7. 字段UpdatedAt用于存儲(chǔ)記錄的修改時(shí)間
保存具有UpdatedAt
字段的記錄將被設(shè)置為當(dāng)前時(shí)間
db.Save(&user) // 將會(huì)設(shè)置`UpdatedAt`為當(dāng)前時(shí)間 db.Model(&user).Update("name", "jinzhu") // 將會(huì)設(shè)置`UpdatedAt`為當(dāng)前時(shí)間
2.8. 字段DeletedAt用于存儲(chǔ)記錄的刪除時(shí)間,如果字段存在
刪除具有DeletedAt
字段的記錄,它不會(huì)沖數(shù)據(jù)庫(kù)中刪除,但只將字段DeletedAt
設(shè)置為當(dāng)前時(shí)間,并在查詢(xún)時(shí)無(wú)法找到記錄,請(qǐng)參閱[軟刪除]
以上就是golang gorm模型結(jié)構(gòu)體的定義示例的詳細(xì)內(nèi)容,更多關(guān)于golang gorm模型結(jié)構(gòu)體的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Go 語(yǔ)言中g(shù)in使用gzip壓縮遇到的問(wèn)題
這篇文章主要介紹了Go 語(yǔ)言中g(shù)in使用gzip壓縮遇到的問(wèn)題,需要的朋友可以參考下2017-09-09如何利用golang運(yùn)用mysql數(shù)據(jù)庫(kù)
這篇文章主要介紹了如何利用golang運(yùn)用mysql數(shù)據(jù)庫(kù),文章對(duì)依賴(lài)包、db對(duì)象注入ApiRouter等內(nèi)容,需要的小伙伴可以參考一下2022-03-03GO利用channel協(xié)調(diào)協(xié)程的實(shí)現(xiàn)
本文主要介紹了GO利用channel協(xié)調(diào)協(xié)程的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-05-05Goland配置leetcode的實(shí)現(xiàn)示例
本文主要介紹了Goland配置leetcode的實(shí)現(xiàn)示例,文中通過(guò)圖文介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-06-06Go語(yǔ)言規(guī)范context?類(lèi)型的key用法示例解析
這篇文章主要為大家介紹了Go語(yǔ)言規(guī)范context?類(lèi)型的key用法示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-08-08