Beego脱坑(十二)ORM介绍并创建第一个表


title: Beego脱坑(十二)ORM介绍并创建第一个表
tags: go,beego,orm
author : Clown95


ORM介绍

什么是ORM?即对象关系映射(Object Relational Mapping,简称ORM)。ORM 就是通过实例对象的语法,完成关系型数据库的操作的技术。

beego ORM 是一个强大的 Go 语言 ORM 框架。她的灵感主要来自 Django ORM 和 SQLAlchemy。它支持go语言中所有的类型存储,允许直接使用原生的SQL语句,采用GRUD风格能够轻松上手,能自动Join关联表,并允许跨数据库兼容查询。

在beego中 数据库和go语言对应的映射关系为:

  • 数据库的表(table) --> 结构体(Struct)
  • 记录(record,行数据) --> 结构体实例对象(object)
  • 字段(field) --> 对象的属性(attribute)
image

beego ORM 已支持数据库数据库并不多,但是基本上都是主流数据库:

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

如需使用上面某种数据库,请先go get,并且导入库的时候需要在前面使用 "_" 符号

安装ORM

首先我们需要安装ORM :

go get github.com/astaxie/beego/orm

当我们使用ORM操作mysql数据库之前,必须要导入mysql数据库驱动,如果你没有安装mysql驱动,你应该先安装它。

go get github.com/go-sql-driver/mysql

然后导入mysql驱动:

import (
    _ "github.com/go-sql-driver/mysql"
)

因为我们代码中不会直接调用myql的驱动包,所以我们需要使用"_"来占位。

设计表结构

接下来我们将使用ORM和mysql创建一个用户表,我们复用[Beego脱坑(八)表单数据验证](https://blog.csdn.net/yang731227/article/details/82252016) 这篇文章中使用过的User结构体,如果你不清楚可以返回去查看下之前的文章。

type UserTable struct {  //为了避免和之前的结构体冲突 改下名
    User     string
    Pwd      string
    RealName string
    Age      string 
    IdCard   string
    Email    string
    Tel      string
}

使用ORM创建表

接下来我们使用创建一个UserTable表

package controllers

import (
    "github.com/astaxie/beego"
    "github.com/astaxie/beego/orm"
    _ "github.com/go-sql-driver/mysql"
)

type ORMdemoController struct {
    beego.Controller
}
// UserTable 在ORM中使用有一个错误,具体什么错误下面讲解
type UserTable struct {
    User     string
    Pwd      string
    RealName string
    Age      string
    IdCard   string
    Email    string
    Tel      string
}

func (this * ORMdemoController) Get(){
    //注册数据驱动
    orm.RegisterDriver("mysql", orm.DRMySQL) // mysql / sqlite3 / postgres 这三种是beego默认已经注册过的,所以可以无需设置
    //注册数据库 ORM 必须注册一个别名为 default 的数据库,作为默认使用
    orm.RegisterDataBase("default", "mysql", "root:yangjie@tcp(127.0.0.1:3306)/db_user?charset=utf8")
    //注册模型
    orm.RegisterModel(new(UserTable))
    //自动创建表 参数二为是否开启创建表   参数三是否更新表
    orm.RunSyncdb("default", true, true)
    this.Ctx.WriteString("表创建成功")
}

注册路由:

    beego.Router("/ormdemo",&controllers.ORMdemoController{})

现在我们输入http://127.0.0.1:8080/ormdemo 执行一下,发现浏览器拒绝访问。
然后我们看下日志,它提示我们UserTable需要一个主键字段,如果没有设置主键,默认使用id 字段。

image

现在我们引出创建表之前需要了解的事情:

  • 我们定义结构体作为表,必须要有主键;
  • 当 Field 类型为 int, int32, int64, uint, uint32, uint64 时,可以设置字段为自增健。
  • 当模型定义里没有主键时,符合int类型且名称为 Id 的 Field 将被视为自增健;
  • 属性的首字母最好是大写,设置属性为公开访问性。

现在我们根据上面的要求更改UserTable

type UserTable struct {
    ID       int  //添加 int型字段ID
    User     string
    Pwd      string
    RealName string
    Age      string
    IdCard   string
    Email    string
    Tel      string
}

然后重新执行,可以看到我们成功创建了user_table表,并输出了创建的sql语句。

image

我们来说明下RegisterDataBase:

orm.RegisterDataBase("default", "mysql", "root:yangjie@tcp(127.0.0.1:3306)/db_user?charset=utf8")
  • 参数1 数据库的别名,ORM 必须注册一个别名为 default 的数据库,作为默认使用。
  • 参数2 数据库驱动
  • 参数3 对应的连接字符串,root和yangjie数据库链接账号和密码 ,tcp(127.0.0.1:3306)数据库链接地址,db_user是使用的库
  • 参数4(可选) 设置最大空闲连接
  • 参数5(可选) 设置最大数据库连接 (go >= 1.2)

使用StructTag

刚刚创建表,我们没有对表进行详细的设计,例如,没有制定字段的长度,没有指定主键,现在我们使用Tag对属性进行详细的设置:

type UserTable struct {
    ID       int    `orm:"pk;auto;column(id)"`        //设置主键自增长 字段名为 id
    User     string `orm:"size(15);column(user)"`     //设置长度为15 字段名为 user
    Pwd      string `orm:"size(20);column(pwd)"`      //设置长度为20 字段名为 pwd
    RealName string `orm:"size(10);column(realname)"` //设置长度为10 字段名为 realname
    Age      string `orm:column(age)"`                //设置字段名为age
    IdCard   string `orm:"size(18);column(idcard)"`   //设置长度为18 字段名为 idcard
    Email    string `orm:"size(100);column(email)"`   //设置长度为100 字段名为 email
    Tel      string `orm:"size(11);column(tel)"`      //设置长度为11 字段名为 tel
}

我们先手动删除原来的表,再次执行程序,可以发现,跟之前的显示不一样了:

image

通过图形管理工具,我们可以看到 在 db_user 库中,为我们生成了 user_talbe

表名设置

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

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

除了开头的大写字母以外,遇到大写会增加 _,原名称中的下划线保留。例如我的UserTable转换成user_talbe。

除了beego帮我自动转换表名外,我们还可以使用TableName自定义表名:

type UserTable struct {
        /*
        .....
        */
}

func (u *UserTable) TableName() string {
    return "UserTable"  //表名被改为UserTable
}

我们还可以使用RegisterModelWithPrefix为表名设置前缀:

//orm.RegisterModel(new(UserTable)) //注释掉原来的
orm.RegisterModelWithPrefix("prefix_", new(UserTable)) 

这样我们的表名就是 prefix_user_talbe

image
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容