Beego ORM
beego ORM简介
Beego ORM是一个强大的Go语言ORM框架。它的灵感主要来自Diango ORM和SQLAlchemy。它支持Go语言中所有的类型存储,允许直接使用原生的SQL语句,采用CRUD
风格能够轻松上手,能进行关联表查询,并允许跨数据库兼容查询。
在Beego ORM中,数据库和Go语言对应的映射关系为:
- 数据库的表(table)→结构体(struct);
- 记录(record,行数据)→结构体实例对象(object);
- 字段(field)→对象的属性(attribute)。
安装Beego ORM
go get github.com/astaxie/beego/orm
在使用Beego ORM操作MySQL数据库之前,必须导入MySQL数据库驱动程序。如果没有安装MySQL驱动程序,则应该先安装。安装命令如下:
go get github.com/go-sql-driver/mysql
连接数据库
Beego ORM用orm.RegisterDataBase()函数进行数据库连接。必须注册一个名为default的数据库作为默认使用。示例代码如下:
import (
"github.com/astaxie/beego/orm"
_ "github.com/go-sql-driver/mysql"
)
func main() {
orm.RegisterDataBase("default", "mysql", "root:123456@/chapter05?charset=utf8")
orm.SetMaxOpenConns("default", 10)
orm.SetMaxIdleConns("default", 10)
}
注册模型
如果用orm.QuerySeter接口进行高级查询,则注册模型是必须有的步骤。反之,如果只用Raw查询和映射到struct,则无须注册模型。注册模型的实质是,将ORM语句转化为SQL语句并写进数据库。
将定义的模型进行注册,常见的写法是:先新建一个模型文件,然后在它的iit()函数中进行注册:
package model
import "github.com/astaxie/beego/orm"
type BeegoUser struct {
Id int //默认主键为Id
Name string
Phone string
}
func init() {
orm.RegisterModel(new(BeegoUser))
}
也可以同时注册多个模型:
orm.RegisterModel(new (BeegoUser),new (Profile),new (Post)).
在注册模型时,可以设置数据表的前缀。形式如下:
orm.RegisterModelWithPrefix("prefix_",new(User))
以上语句创建的表名为prefix_user。
Beego ORM的使用
创建一个名为beego_user的表:
create table `beego_user`(
`id` int(10) unsigned not null auto_increment comment '自增主键',
`name` varchar(20) default '' comment '名字',
`phone` varchar(20) default '' comment '电话',
primary key(`id`)
) engine=InnoDB default charset=utf8
定义结构体模型:
type BeegoUser struct {
Id int //默认主键为Id
Name string
Phone string
}
插入数据:
package main
import (
"./model"
"fmt"
"github.com/astaxie/beego/orm"
_ "github.com/go-sql-driver/mysql"
)
func main() {
//插入数据
o := orm.NewOrm()
user := new(model.BeegoUser)
user.Name = "tom"
user.Phone = "11122223333"
fmt.Println(o.Insert(user)) //1 <nil>
}
func init() {
orm.RegisterDataBase("default", "mysql", "root:123456@/chapter05?charset=utf8")
orm.SetMaxOpenConns("default", 10)
orm.SetMaxIdleConns("default", 10)
//需要在init()函数中注册已经定义的Model
orm.RegisterModel(new(model.BeegoUser))
}
查询数据:
func selectTest() {
o := orm.NewOrm()
user := model.BeegoUser{}
//对主键Id赋值,查询数据条件是where id=1
user.Id = 1
//通过read()方法查询 select * from beego_user where id = 1
err := o.Read(&user)
if err == orm.ErrNoRows {
fmt.Println("查询不到")
} else if err == orm.ErrMissPK {
fmt.Println("找不到主键")
} else {
fmt.Println(user)
}
}
更新数据:
func updateTest() {
o := orm.NewOrm()
user := model.BeegoUser{}
user.Id = 1
user.Name = "jerry" // 没有设置Phone的值,则默认会全部更新,数据库内phone字段会被更新为''
num, err := o.Update(&user)
if err != nil {
fmt.Println("更新失败")
} else {
fmt.Println("影响行数:", num)
}
}
删除数据:
func deleteTest() {
o := orm.NewOrm()
user := model.BeegoUser{}
user.Id = 1
if num, err := o.Delete(&user); err != nil {
fmt.Println("删除失败")
} else {
fmt.Println("影响行数:", num)
}
}
原声SQL查询:
func rowSelectTest() {
o := orm.NewOrm()
var r orm.RawSeter
r = o.Raw("UPDATE beego_user SET name = ? WHERE name = ?", "jim", "tom")
res, err := r.Exec()
if err != nil {
fmt.Println("查询失败")
} else {
fmt.Println(res.RowsAffected())
}
}
事务处理:
要进行事务处理,则需要在SQL语句的开头使用Begin()方法开启事务,在Begin()方法后编写执行的SQL语句,最后进行判断:如果异常,则执行Rollback()方法回滚;如果正常,则执行Commit()方法提交。见下方代码:
func txTest() {
o := orm.NewOrm()
o.Begin()
user1 := model.BeegoUser{}
user1.Id = 3
user1.Name = "sss"
user2 := model.BeegoUser{}
user2.Id = 12
user2.Name = "xxx"
_, err1 := o.Update(&user1)
_, err2 := o.Update(&user2)
//检测事务执行状态
if err1 != nil || err2 != nil {
//如果事务执行失败,则回滚事务
fmt.Println(err1)
fmt.Println(err2)
o.Rollback()
} else {
//如果任务执行成功,则提交事务
o.Commit()
}
}