GoWeb——Beego ORM简单使用

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()
	}
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值