golang中web框架-beego中的model

615 阅读2分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

beego中的model

对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术。简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到关系数据库中。

已支持数据库驱动:

  • MySQL : github. com/go-sq-driver/mysql
  • PostgreSQL : github. com/lib/pq
  • Sqlite3 : github. com/mattn/go-sqite3

模型(Models) ORM特性:

  • 支持Go的所有类型存储
  • 轻松上手,采用简单的CRUD风格
  • 自动Join关联表
  • 跨数据库兼容查询
  • 允许直接使用SQL查询/映射
  • 严格完整的测试保证ORM的稳定与健壮
模型定义

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

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

AuthUser -> auth_user
Auth_User -> auth__user
DB_AuthUser -> d_b__auth_user

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

自定义表名
type User struct {
    Id int
    Name string
}

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

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

忽略字段

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

type User struct {
...
    Username string `orm:"column(username)"`
    AnyField string `orm:"-"`
...
}

结构体和表映射时,可以自动映射,也可以通过orm:column(列名)来指定。

创建Model

自动建表

//自动建表
orm.RunSyncdb("default", false, true)

以下是官方文档的案例:

关系模型

# 外键始终在子表上

#一个用户对应一个简介;一个简介对应一个用户;
one2one:User(子表) -> Profile(主表);one2one:Profile -> User 

#一个邮件对应一个用户;一个用户有多个邮件;
one2many:Post(子表) -> User(主表);many2one:User -> Post 

#一个邮件对应多个标签;一个标签对应多个邮件;
many2many:Post(子表) -> Tag(主表);many2many:Tag -> Post 

说明:

使用标签`orm:"column(id)`对属性进行标注,用于解析。
标注逻辑外键,自动建表时不会生成外键。
`orm:"rel(one)"` 表示one2one
`orm:"rel(fk)"`  表示one2many
`orm:"rel(m2m)"` 表示many2many
`orm:"reverse(one)"` `orm:"reverse(one)"`  标注反向关系

创建结构体

//-----------定义struct-------------

type User struct { // 对应user表
    Id      int
    Name    string
    Profile *Profile `orm:"rel(one)"`      // OneToOne relation
    Post    []*Post  `orm:"reverse(many)"` // 设置一对多的反向关系
}

type Profile struct {
    Id   int
    Age  int16
    User *User `orm:"reverse(one)"` // 设置一对一反向关系(可选)
}

type Post struct {
    Id    int
    Title string
    User  *User  `orm:"rel(fk)"` //设置一对多关系
    Tags  []*Tag `orm:"rel(m2m)"`
}

type Tag struct {
    Id    int
    Name  string
    Posts []*Post `orm:"reverse(many)"`
}

注册Model

在init()方法 中,添加注册model代码:

func init() {
    orm.RegisterDriver("mysql", orm.DRMySQL) //可以不加
    orm.RegisterDataBase("default", "mysql", "root:123456@tcp(127.0.0.1:3306)/mytest?charset=utf8", 30)

    // 需要在init中注册定义的model
    orm.RegisterModel(new(User), new(Post), new(Profile), new(Tag)
}

示例代码:

修改router.go文件,注册路由:

func init() {
    beego.Router("/", &controllers.MainController{})
    beego.Router("/testcreatetable", &controllers.ModelController{},"get:CreateTable")
}