前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Beego Models之四模型定义

Beego Models之四模型定义

作者头像
若与
发布2018-08-03 09:35:19
2.1K0
发布2018-08-03 09:35:19
举报

模型定义

使用orm定义,然后使用cmd方式,自动建表,不过在实际生产中还是直接使用sql操作的,这种模型定义在生产环境中定义的比较少,基本上都是直接使用基本类型,一些特殊的,都是在数据库中定义的。

复杂的模型定义不是必须的,此功能用作数据库数据转换和自动建表

默认的表名规则,使用驼峰转蛇形:

代码语言:javascript
复制
AuthUser -> auth_user
Auth_User -> auth__user
DB_AuthUser -> d_b__auth_user

除了开头的大写字母以外,遇到大写会增加 _,原名称中的下划线保留。

自定义表名

代码语言:javascript
复制
type User struct {
    Id int
    Name string
}

func (u *User) TableName() string {
    return "auth_user"
}

如果前缀设置prefix_ 那么表名为:prefix_auth_user

自定义索引

为单个或多个字段增加索引

代码语言:javascript
复制
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"},
    }
}

自定义引擎

仅支持 MySQL

默认使用的引擎,为当前数据库的默认引擎,这个是由你的 mysql 配置参数决定的。

你可以在模型里设置 TableEngine 函数,指定使用的引擎

代码语言:javascript
复制
type User struct {
    Id    int
    Name  string
    Email string
}

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

设置参数

代码语言:javascript
复制
orm:"null;rel(fk)"

多个设置间使用 ; 分隔,设置的值如果是多个,使用 , 分隔。

忽略字段

设置 - 即可忽略 struct 中的字段

代码语言:javascript
复制
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

代码语言:javascript
复制
Name string `orm:"null"`
index

为单个字段增加索引

unique

为单个字段增加 unique 键

代码语言:javascript
复制
Name string `orm:"unique"`
column

为字段设置 db 字段的名称

代码语言:javascript
复制
Name string `orm:"column(user_name)"`
size

string 类型字段默认为 varchar(255)

设置 size 以后,db type 将使用 varchar(size)

代码语言:javascript
复制
Title string `orm:"size(60)"`
digits / decimals

设置 float32, float64 类型的浮点精度

代码语言:javascript
复制
Money float64 `orm:"digits(12);decimals(4)"`

总长度 12 小数点后 4 位 eg: 99999999.9999

auto_now / auto_now_add
代码语言:javascript
复制
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

代码语言:javascript
复制
Created time.Time `orm:"auto_now_add;type(date)"`

设置为 datetime 时,time.Time 字段的对应 db 类型使用 datetime

代码语言:javascript
复制
Created time.Time `orm:"auto_now_add;type(datetime)"`
default

为字段设置默认值,类型必须符合(目前仅用于级联删除时的默认值)

代码语言:javascript
复制
type User struct {
    ...
    Status int `orm:"default(1)"`
    ...
}

表关系设置

rel / reverse

RelOneToOne:

代码语言:javascript
复制
type User struct {
    ...
    Profile *Profile `orm:"null;rel(one);on_delete(set_null)"`
    ...
}

对应的反向关系 RelReverseOne:

代码语言:javascript
复制
type Profile struct {
    ...
    User *User `orm:"reverse(one)"`
    ...
}

RelForeignKey:

代码语言:javascript
复制
type Post struct {
    ...
    User *User `orm:"rel(fk)"` // RelForeignKey relation
    ...
}

对应的反向关系 RelReverseMany:

代码语言:javascript
复制
type User struct {
    ...
    Posts []*Post `orm:"reverse(many)"` // fk 的反向关系
    ...
}

RelManyToMany:

代码语言:javascript
复制
type Post struct {
    ...
    Tags []*Tag `orm:"rel(m2m)"` // ManyToMany relation
    ...
}

对应的反向关系 RelReverseMany:

代码语言:javascript
复制
type Tag struct {
    ...
    Posts []*Post `orm:"reverse(many)"`
    ...
}
rel_table / rel_through

此设置针对 orm:"rel(m2m)" 的关系字段

代码语言:javascript
复制
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 关系删除时,如何处理关系字段。

代码语言:javascript
复制
cascade        级联删除(默认值)
set_null       设置为 NULL,需要设置 null = true
set_default    设置为默认值,需要设置 default 值
do_nothing     什么也不做,忽略
代码语言:javascript
复制
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 的相关例子
代码语言:javascript
复制
type User struct {
    Id int
    Name string
}

type Post struct {
    Id int
    Title string
    User *User `orm:"rel(fk)"`
}

假设 Post -> User 是 ManyToOne 的关系,也就是外键。

代码语言:javascript
复制
o.Filter("Id", 1).Delete()

这个时候即会删除 Id 为 1 的 User 也会删除其发布的 Post

不想删除的话,需要设置 set_null

代码语言:javascript
复制
type Post struct {
    Id int
    Title string
    User *User `orm:"rel(fk);null;on_delete(set_null)"`
}

那这个时候,删除 User 只会把对应的 Post.user_id 设置为 NULL

当然有时候为了高性能的需要,多存点数据无所谓啊,造成批量删除才是问题。

代码语言:javascript
复制
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(char) 时

char(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(char) 时

character(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 默认为 text

varchar(size)

string - 设置 type(char) 时

char(size)

string - 设置 type(text) 时

text

string - 设置 type(json) 时

json

string - 设置 type(jsonb) 时

jsonb

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
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018.07.29 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 模型定义
    • 自定义表名
      • 自定义索引
        • 自定义引擎
          • 设置参数
            • 表关系设置
              • 模型字段与数据库类型的对应
                • 关系型字段
                相关产品与服务
                云数据库 MySQL
                腾讯云数据库 MySQL(TencentDB for MySQL)为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。其具备6大企业级特性,包括企业级定制内核、企业级高可用、企业级高可靠、企业级安全、企业级扩展以及企业级智能运维。通过使用腾讯云数据库 MySQL,可实现分钟级别的数据库部署、弹性扩展以及全自动化的运维管理,不仅经济实惠,而且稳定可靠,易于运维。
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档