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脱坑(八)表单数据验证](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 字段。
现在我们引出创建表之前需要了解的事情:
- 我们定义结构体作为表,必须要有主键;
- 当 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)
使用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