在使用beego model 去操作数据库时 有一些疑惑  找到了一个比较好的博文

原文地址 : https://my.oschina.net/u/252343/blog/829912 (KelvinQ )侵删

模型定义

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

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

  1.  
    AuthUser -> auth_user
  2.  
    Auth_User -> auth__user
  3.  
    DB_AuthUser -> d_b__auth_user

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

自定义表名

  1.  
    type User struct {
  2.  
    Id int
  3.  
    Name string
  4.  
    }
  5.  
     
  6.  
    func (u *User) TableName() string {
  7.  
    return "auth_user"
  8.  
    }

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

自定义索引

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

  1.  
    type User struct {
  2.  
    Id int
  3.  
    Name string
  4.  
    Email string
  5.  
    }
  6.  
     
  7.  
    // 多字段索引
  8.  
    func (u *User) TableIndex() [][]string {
  9.  
    return [][]string{
  10.  
    []string{"Id", "Name"},
  11.  
    }
  12.  
    }
  13.  
     
  14.  
    // 多字段唯一键
  15.  
    func (u *User) TableUnique() [][]string {
  16.  
    return [][]string{
  17.  
    []string{"Name", "Email"},
  18.  
    }
  19.  
    }

自定义引擎

仅支持 MySQL

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

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

  1.  
    type User struct {
  2.  
    Id int
  3.  
    Name string
  4.  
    Email string
  5.  
    }
  6.  
     
  7.  
    // 设置引擎为 INNODB
  8.  
    func (u *User) TableEngine() string {
  9.  
    return "INNODB"
  10.  
    }

设置参数

orm:"null;rel(fk)"

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

忽略字段

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

  1.  
    type User struct {
  2.  
    ...
  3.  
    AnyField string `orm:"-"`
  4.  
    ...
  5.  
    }

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

  1.  
    Created time.Time `orm:"auto_now_add;type(datetime)"`
  2.  
    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

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

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

表关系设置

rel / reverse

RelOneToOne:

  1.  
    type User struct {
  2.  
    ...
  3.  
    Profile *Profile `orm:"null;rel(one);on_delete(set_null)"`
  4.  
    ...
  5.  
    }

对应的反向关系 RelReverseOne:

  1.  
    type Profile struct {
  2.  
    ...
  3.  
    User *User `orm:"reverse(one)"`
  4.  
    ...
  5.  
    }

RelForeignKey:

  1.  
    type Post struct {
  2.  
    ...
  3.  
    User *User `orm:"rel(fk)"` // RelForeignKey relation
  4.  
    ...
  5.  
    }

对应的反向关系 RelReverseMany:

  1.  
    type User struct {
  2.  
    ...
  3.  
    Posts []*Post `orm:"reverse(many)"` // fk 的反向关系
  4.  
    ...
  5.  
    }

RelManyToMany:

  1.  
    type Post struct {
  2.  
    ...
  3.  
    Tags []*Tag `orm:"rel(m2m)"` // ManyToMany relation
  4.  
    ...
  5.  
    }

对应的反向关系 RelReverseMany:

  1.  
    type Tag struct {
  2.  
    ...
  3.  
    Posts []*Post `orm:"reverse(many)"`
  4.  
    ...
  5.  
    }

rel_table / rel_through

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

  1.  
    rel_table 设置自动生成的 m2m 关系表的名称
  2.  
    rel_through 如果要在 m2m 关系中使用自定义的 m2m 关系表
  3.  
    通过这个设置其名称,格式为 pkg.path.ModelName
  4.  
    eg: app.models.PostTagRel
  5.  
    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 关系删除时,如何处理关系字段。

  1.  
    cascade 级联删除(默认值)
  2.  
    set_null 设置为 NULL,需要设置 null = true
  3.  
    set_default 设置为默认值,需要设置 default 值
  4.  
    do_nothing 什么也不做,忽略
  1.  
    type User struct {
  2.  
    ...
  3.  
    Profile *Profile `orm:"null;rel(one);on_delete(set_null)"`
  4.  
    ...
  5.  
    }
  6.  
    type Profile struct {
  7.  
    ...
  8.  
    User *User `orm:"reverse(one)"`
  9.  
    ...
  10.  
    }
  11.  
     
  12.  
    // 删除 Profile 时将设置 User.Profile 的数据库字段为 NULL

关于 on_delete 的相关例子

  1.  
    type User struct {
  2.  
    Id int
  3.  
    Name string
  4.  
    }
  5.  
     
  6.  
    type Post struct {
  7.  
    Id int
  8.  
    Title string
  9.  
    User *User `orm:"rel(fk)"`
  10.  
    }

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

o.Filter("Id", 1).Delete()

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

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

  1.  
    type Post struct {
  2.  
    Id int
  3.  
    Title string
  4.  
    User *User `orm:"rel(fk);null;on_delete(set_null)"`
  5.  
    }

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

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

  1.  
    type Post struct {
  2.  
    Id int
  3.  
    Title string
  4.  
    User *User `orm:"rel(fk);null;on_delete(do_nothing)"`
  5.  
    }

那么只要删除的时候,不操作 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

beego orm的使用的更多相关文章

  1. beego orm 忽略字段

    忽略字段 设置 - 即可忽略 struct 中的字段 type User struct { ... AnyField string `orm:"-"` ... } beego or ...

  2. golang学习笔记16 beego orm 数据库操作

    golang学习笔记16 beego orm 数据库操作 beego ORM 是一个强大的 Go 语言 ORM 框架.她的灵感主要来自 Django ORM 和 SQLAlchemy. 目前该框架仍处 ...

  3. 基于beego orm 针对oracle定制

    目前golang的ORM对oracle支持都没有mysql那样完整,一个orm要同时兼容mysql和oracle由于在sql语法上区别,会使整orm变的非常臃肿. 本项目是在beego orm上修改, ...

  4. Golang beego ORM + CRUP 操作详解

      构建beego Web 项目         首先构建一个beego 的web 项目,这个我们完全可以参考beego 官网中的开发文档,上面介绍的非常的详细,在这我就不给大家介绍,主要是介绍ORM ...

  5. beego orm操作mysql数据库

    慢慢弄起来~~ 按官方操作文档试一下. 那个err重复和user编号问题,以后再弄.. package main import ( "fmt" "github.com/a ...

  6. beego orm mysql

    beego框架中的rom支持mysql 项目中使用到mvc模式,总结下使用方式: models中 package models import ( //使用beego orm 必备 "gith ...

  7. beego——ORM使用方法

    先来看一个简单示例: models.gp package main import ( "github.com/astaxie/beego/orm" ) type User stru ...

  8. beego orm

    http://beego.me/docs/mvc/model/overview.md go get github.com/astaxie/beego/orm Simple Usage package ...

  9. beego框架学习--beego orm映射

    什么是ORM 即Object-Relationl Mapping,它的作用是在关系型数据库和对象之间作一个映射,这样,我们在具体的操作数据库的时候,就不需要再去和复杂的SQL语句打交道,只要像平时操作 ...

随机推荐

  1. convertto-securestring结果 使用python解密

    根据微软帮助文档,convertto-securestring有两种加密模式.如果在指定密码的情况下,则使用aes加密,否则使用windows dpapi加密.而且aes加密也没有指明iv值与加密模式 ...

  2. Spring基础(一)_控制反转(IOC)

    Spring-IOC 1.简述 1.1 依赖注入DI 现实开发中,每一个应用都会由两个或多个类组成,这些类之间相互协作完成特定的业务逻辑.根据传统做法,每个对象负责管理与自己协作的对象的引用(也就是, ...

  3. 如何为wordpress 添加favicon

    制做一张16px×16px(像素)大小的图片命名favicon并修改扩展名为.ico,即favicon.ico文件! 方法1:将favicon.ico图标上传到WordPress博客空间的根目录(方法 ...

  4. 利用Kubernetes中的leaderelection实现组件高可用

    在Kubernetes中,通常kube-schduler和kube-controller-manager都是多副本进行部署的来保证高可用,而真正在工作的实例其实只有一个.这里就利用到 leaderel ...

  5. Mysql设置创建时间字段和更新时间字段自动获取时间,填充时间

    1.引言在实际开发中,每条数据的创建时间和修改时间,尽量不需要应用程序去记录,而由数据库获取当前时间自动记录创建时间,获取当前时间自动记录修改时间. 2.创建语句(1)–添加CreateTime 设置 ...

  6. postman之存储测试结果

    前言 在Jmeter的随笔中,我跟大家讲过利用Jmeter工具存储测试结果,那么,postman工具要该如何存储测试结果呢?下面一起来学习吧! 一:添加一个登录请求,填入接口参数点击send 二:点击 ...

  7. cmake处理多源文件目录的方法(转)

    cmake处理源代码分布在不同目录中的情况也很简单,现在假设我们的源代码分布情况如下: 源代码的分布情况 其中src目录下的文件要编译成一个链接库 第一步,项目主目录中的CMakelist.txt 在 ...

  8. 3D点云配准算法简述

    ​蝶恋花·槛菊愁烟兰泣露 槛菊愁烟兰泣露,罗幕轻寒,燕子双飞去. 明月不谙离恨苦,斜光到晓穿朱户. 昨夜西风凋碧树,独上高楼,望尽天涯路. 欲寄彩笺兼尺素.山长水阔知何处? --晏殊 导读: 3D点云 ...

  9. Vue项目使用vant框架

    近期在开发h5端项目,用到vant框架,vant是一款基于Vue的移动UI组件,看了vant的官方文档(https://youzan.github.io/vant/#/zh-CN/)感觉不错,功能比较 ...

  10. Hapi+MySql项目实战配置插件-加载文件渲染母版(三)

    加载插件 一般在其它node框架下,我们安装好插件直接require('插件')就能正常使用了,但是在Hapi下我们必须要Server.register()方法,才能正常使用插件.举个例子: serv ...