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

19 篇文章 36 订阅

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)

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脱坑(八)表单数据验证 这篇文章中使用过的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 字段。

 

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

  • 我们定义结构体作为表,必须要有主键;
  • 当 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语句。

我们来说明下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)

接着我们来讲下  RunSyncdb

orm.RunSyncdb("default", true, true)

通过函数名,我们就可以大概猜到它的用途同步数据库, 它可以帮我们同步表的数据。

  • 参数一 数据库别名,一般为default;
  • 参数二 为ture时自动帮我们创建表;
  • 参数三 是否更新表

参数二,是我们最容易出错的地方,如果值为ture时,表已经存在并且表中有值的情况下,它会先删除我们的表,然后重新创建,这样我们表中的数据就全部丢失了。

 

使用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
}

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

通过图形管理工具,我们可以看到 在 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

 

 

  • 6
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值