複雜的模型定義不是必須的,此功能用做數據庫數據轉換和自動建表mysql
默認的表名規則,使用駝峯轉蛇形:git
AuthUser -> auth_user Auth_User -> auth__user DB_AuthUser -> d_b__auth_user
除了開頭的大寫字母之外,遇到大寫會增長 _
,原名稱中的下劃線保留。sql
type User struct { Id int Name string } func (u *User) TableName() string { return "auth_user" }
若是前綴設置爲 prefix_
那麼表名爲:prefix_auth_user數據庫
爲單個或多個字段增長索引mvc
type User struct { Id int Name string Email string } // 多字段索引 func (u *User) TableIndex() [][]string { return [][]string{ []string{"Id", "Name"}, } } // 多字段惟一鍵 func (u *User) TableUnique() [][]string { return [][]string{ []string{"Name", "Email"}, } }
僅支持 MySQLapp
默認使用的引擎,爲當前數據庫的默認引擎,這個是由你的 mysql 配置參數決定的。函數
你能夠在模型裏設置 TableEngine 函數,指定使用的引擎性能
type User struct { Id int Name string Email string } // 設置引擎爲 INNODB func (u *User) TableEngine() string { return "INNODB" }
orm:"null;rel(fk)"
多個設置間使用 ;
分隔,設置的值若是是多個,使用 ,
分隔。ui
設置 -
便可忽略 struct 中的字段spa
type User struct { ... AnyField string `orm:"-"` ... }
當 Field 類型爲 int, int32, int64, uint, uint32, uint64 時,能夠設置字段爲自增健
Id
的 Field 將被視爲自增健。鑑於 go 目前的設計,即便使用了 uint64,但你也不能存儲到他的最大值。依然會做爲 int64 處理。
設置爲主鍵,適用於自定義其餘類型爲主鍵
數據庫表默認爲 NOT NULL
,設置 null 表明 ALLOW NULL
Name string `orm:"null"`
爲單個字段增長索引
爲單個字段增長 unique 鍵
Name string `orm:"unique"`
爲字段設置 db 字段的名稱
Name string `orm:"column(user_name)"`
string 類型字段默認爲 varchar(255)
設置 size 之後,db type 將使用 varchar(size)
Title string `orm:"size(60)"`
設置 float32, float64 類型的浮點精度
Money float64 `orm:"digits(12);decimals(4)"`
總長度 12 小數點後 4 位 eg: 99999999.9999
Created time.Time `orm:"auto_now_add;type(datetime)"` Updated time.Time `orm:"auto_now;type(datetime)"`
對於批量的 update 此設置是不生效的
設置爲 date 時,time.Time 字段的對應 db 類型使用 date
Created time.Time `orm:"auto_now_add;type(date)"`
設置爲 datetime 時,time.Time 字段的對應 db 類型使用 datetime
Created time.Time `orm:"auto_now_add;type(datetime)"`
爲字段設置默認值,類型必須符合(目前僅用於級聯刪除時的默認值)
type User struct { ... Status int `orm:"default(1)"` ... }
RelOneToOne:
type User struct { ... Profile *Profile `orm:"null;rel(one);on_delete(set_null)"` ... }
對應的反向關係 RelReverseOne:
type Profile struct { ... User *User `orm:"reverse(one)"` ... }
RelForeignKey:
type Post struct { ... User *User `orm:"rel(fk)"` // RelForeignKey relation ... }
對應的反向關係 RelReverseMany:
type User struct { ... Posts []*Post `orm:"reverse(many)"` // fk 的反向關係 ... }
RelManyToMany:
type Post struct { ... Tags []*Tag `orm:"rel(m2m)"` // ManyToMany relation ... }
對應的反向關係 RelReverseMany:
type Tag struct { ... Posts []*Post `orm:"reverse(many)"` ... }
此設置針對 orm:"rel(m2m)"
的關係字段
rel_table 設置自動生成的 m2m 關係表的名稱 rel_through 若是要在 m2m 關係中使用自定義的 m2m 關係表 經過這個設置其名稱,格式爲 pkg.path.ModelName eg: app.models.PostTagRel PostTagRel 表須要有到 Post 和 Tag 的關係
當設置 rel_table 時會忽略 rel_through
設置方法:
orm:"rel(m2m);rel_table(the_table_name)" orm:"rel(m2m);rel_through(pkg.path.ModelName)"
設置對應的 rel 關係刪除時,如何處理關係字段。
cascade 級聯刪除(默認值) set_null 設置爲 NULL,須要設置 null = true set_default 設置爲默認值,須要設置 default 值 do_nothing 什麼也不作,忽略
type User struct { ... Profile *Profile `orm:"null;rel(one);on_delete(set_null)"` ... } type Profile struct { ... User *User `orm:"reverse(one)"` ... } // 刪除 Profile 時將設置 User.Profile 的數據庫字段爲 NULL
type User struct { Id int Name string } type Post struct { Id int Title string User *User `orm:"rel(fk)"` }
假設 Post -> User 是 ManyToOne 的關係,也就是外鍵。
o.Filter("Id", 1).Delete()
這個時候即會刪除 Id 爲 1 的 User 也會刪除其發佈的 Post
不想刪除的話,須要設置 set_null
type Post struct { Id int Title string User *User `orm:"rel(fk);null;on_delete(set_null)"` }
那這個時候,刪除 User 只會把對應的 Post.user_id 設置爲 NULL
固然有時候爲了高性能的須要,多存點數據無所謂啊,形成批量刪除纔是問題。
type Post struct { Id int Title string User *User `orm:"rel(fk);null;on_delete(do_nothing)"` }
那麼只要刪除的時候,不操做 Post 就能夠了