beego orm 模型定義

模型定義

複雜的模型定義不是必須的,此功能用做數據庫數據轉換和自動建表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 函數,指定使用的引擎post

type User struct {
    Id    int
    Name  string
    Email string
}

// 設置引擎爲 INNODB
func (u *User) TableEngine() string {
    return "INNODB"
}

設置參數

orm:"null;rel(fk)"

多個設置間使用 ; 分隔,設置的值若是是多個,使用 , 分隔。性能

忽略字段

設置 - 便可忽略 struct 中的字段ui

type User struct {
...
    AnyField string `orm:"-"`
...
}

auto

當 Field 類型爲 int, int32, int64, uint, uint32, uint64 時,能夠設置字段爲自增健

  • 當模型定義裏沒有主鍵時,符合上述類型且名稱爲 Id 的 Field 將被視爲自增健。

鑑於 go 目前的設計,即便使用了 uint64,但你也不能存儲到他的最大值。依然會做爲 int64 處理。

參見 issue 6113

pk

設置爲主鍵,適用於自定義其餘類型爲主鍵

null

數據庫表默認爲 NOT NULL,設置 null 表明 ALLOW NULL

Name string `orm:"null"`

index

爲單個字段增長索引

unique

爲單個字段增長 unique 鍵

Name string `orm:"unique"`

column

爲字段設置 db 字段的名稱

Name string `orm:"column(user_name)"`

size

string 類型字段默認爲 varchar(255)

設置 size 之後,db type 將使用 varchar(size)

Title string `orm:"size(60)"`

digits / decimals

設置 float32, float64 類型的浮點精度

Money float64 `orm:"digits(12);decimals(4)"`

總長度 12 小數點後 4 位 eg: 99999999.9999

auto_now / auto_now_add

Created time.Time `orm:"auto_now_add;type(datetime)"`
Updated time.Time `orm:"auto_now;type(datetime)"`
  • auto_now 每次 model 保存時都會對時間自動更新
  • auto_now_add 第一次保存時才設置時間

對於批量的 update 此設置是不生效的

type

設置爲 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)"`

default

爲字段設置默認值,類型必須符合(目前僅用於級聯刪除時的默認值)

type User struct {
    ...
    Status int `orm:"default(1)"`
    ...
}

表關係設置

rel / reverse

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)"`
    ...
}

rel_table / rel_through

此設置針對 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)"

on_delete

設置對應的 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

關於 on_delete 的相關例子

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 就能夠了。

模型字段與數據庫類型的對應

在此列出 ORM 推薦的對應數據庫類型,自動建表功能也會以此爲標準。

默認全部的字段都是 NOT NULL

MySQL

go mysql
int, int32 - 設置 auto 或者名稱爲 Id 時 integer AUTO_INCREMENT
int64 - 設置 auto 或者名稱爲 Id 時 bigint AUTO_INCREMENT
uint, uint32 - 設置 auto 或者名稱爲 Id 時 integer unsigned AUTO_INCREMENT
uint64 - 設置 auto 或者名稱爲 Id 時 bigint unsigned AUTO_INCREMENT
bool bool
string - 默認爲 size 255 varchar(size)
string - 設置 type(text) 時 longtext
time.Time - 設置 type 爲 date 時 date
time.Time datetime
byte tinyint unsigned
rune integer
int integer
int8 tinyint
int16 smallint
int32 integer
int64 bigint
uint integer unsigned
uint8 tinyint unsigned
uint16 smallint unsigned
uint32 integer unsigned
uint64 bigint unsigned
float32 double precision
float64 double precision
float64 - 設置 digits, decimals 時 numeric(digits, decimals)

Sqlite3

go sqlite3
int, int32, int64, uint, uint32, uint64 - 設置 auto 或者名稱爲 Id 時 integer AUTOINCREMENT
bool bool
string - 默認爲 size 255 varchar(size)
string - 設置 type(text) 時 text
time.Time - 設置 type 爲 date 時 date
time.Time datetime
byte tinyint unsigned
rune integer
int integer
int8 tinyint
int16 smallint
int32 integer
int64 bigint
uint integer unsigned
uint8 tinyint unsigned
uint16 smallint unsigned
uint32 integer unsigned
uint64 bigint unsigned
float32 real
float64 real
float64 - 設置 digits, decimals 時 decimal

PostgreSQL

go postgres
int, int32, int64, uint, uint32, uint64 - 設置 auto 或者名稱爲 Id 時 serial
bool bool
string - 默認爲 size 255 varchar(size)
string - 設置 type(text) 時 text
time.Time - 設置 type 爲 date 時 date
time.Time timestamp with time zone
byte smallint CHECK(「column」 >= 0 AND 「column」 <= 255)
rune integer
int integer
int8 smallint CHECK(「column」 >= -127 AND 「column」 <= 128)
int16 smallint
int32 integer
int64 bigint
uint bigint CHECK(「column」 >= 0)
uint8 smallint CHECK(「column」 >= 0 AND 「column」 <= 255)
uint16 integer CHECK(「column」 >= 0)
uint32 bigint CHECK(「column」 >= 0)
uint64 bigint CHECK(「column」 >= 0)
float32 double precision
float64 double precision
float64 - 設置 digits, decimals 時 numeric(digits, decimals)

關係型字段

其字段類型取決於對應的主鍵。

  • RelForeignKey
  • RelOneToOne
  • RelManyToMany
  • RelReverseOne
  • RelReverseMany
相關文章
相關標籤/搜索