Go语言高并发与微服务实战 - 学习笔记
文章目录
- Go语言高并发与微服务实战 - 学习笔记
- 第5章 构建Go Web服务器
- 5.6 Golang ORM框架beego实践
第5章 构建Go Web服务器
5.6 Golang ORM框架beego实践
之前我们已经学习了Go语言中的几种数据库存储方式。如使用原生的Go语言连接MySQL的方法,使用Go语言自带的database/sql数据库连接API,通过原生的写法实现数据库存储。
目前开源界也有很多封装好的ORM框架,支持事务性、链式查询等,帮我们简省些重复的操作,提高代码可读性。
Golang ORM框架有beego、gorm、xorm和gorose等。
beego不仅仅是一个ORM框架,而且严格来说,beego是一个快速开发Go语言应用的HTTP框架,它可以用来快速
开发API、Web及后端服务等各种应用,是一个RESTful的框架,beego的主要设计灵感来源于tornado、sinatra和flask这三个框架,同时结合了Go语言本身的一些特性(如interface、struct嵌入等),如下图所示。
以上为 beego 的八大模块。【6666】
beego是基于八大独立的模块构建的,是一个高度解耦的框架。
作者在设计beego之初就考虑了功能模块化,用户既使不使用beego的HTTP逻辑,也依旧可以独立使用这些
模块。
例如:可以使用cache模块来做缓存逻辑:使用日志模块来记录操作信息:使用config模块来解析各种格式的文件。所以beego不仅可以用于HTTP类的应用开发,在Socket游戏开发中也是很有用的模块,这也是beego为什么受欢迎的一个原因。
beego ORM是一个强大的Go语言ORM框架.据官网介绍,它的灵感主要来自Django ORM和SQLAlchemy。目前已支持的数据库驱动:
- MySQL:github.com/go-sql-driver/mysql
- PostgreSQL:github.com/lib/pq
- Sqlite3:github.com/mattn/go-sqlite3
beego ORM采用简单的CRUD风格,具有支持Go的所有类型存储、自动Join关联表、跨数据库兼容查询、允许直接使用SQL查询/映射等特性,严格完整的测试保证ORM的稳定与健壮。
我们通过一个例子来看一下基于beego ORM进行对象的增删改查,代码如下:
先把数据库中的表干掉了
package main
import (
"fmt"
"github.com/astaxie/beego/orm"
_ "github.com/go-sql-driver/mysql"
)
// 结构体模型
type User struct {
UserId int `orm:"pk"` //主键
Name string `orm:"size(100)"`
}
func init() {
// 数据库设置
orm.RegisterDataBase("default", "mysql", "root:200039@tcp(127.0.0.1:3306)/gogogo?charset=utf8", 30)
// 注册model, 可多个
orm.RegisterModel(new(User))
// 创建表
orm.RunSyncdb("default", false, true)
}
func main() {
o := orm.NewOrm()
user := User{Name: "DingJiaxiong"}
// 插入
id, err := o.Insert(&user)
fmt.Printf("ID: %d , ERR: %v\n", id, err)
// 更新
user.Name = "fengfeng"
num, err := o.Update(&user)
fmt.Printf("NUM: %d , ERR: %v\n", num, err)
// 读取
u := User{UserId: user.UserId}
err = o.Read(&u)
fmt.Printf("ERR: %v\n", err)
var maps []orm.Params
res, err := o.Raw("select * from user").Values(&maps)
fmt.Printf("NUM: %d , ERR: %v\n", res, err)
for _, term := range maps {
fmt.Println(term["user_id"], ":", term["name"])
}
// 删除
num, err = o.Delete(&u)
fmt.Printf("NUM: %d , ERR: %v\n", num, err)
}
运行输出结果:
可以看到,程序首先执行了数据表的创建,User对象映射成数据表的两个属性:user_id和name。当我们无法使用ORM表达更加复杂的SQL时,也可以直接使用SQL来完成查询/映射操作,代码如下:
var maps []orm.Params
res, err := o.Raw("select * from user").Values(&maps)
fmt.Printf("NUM: %d , ERR: %v\n", res, err)
for _, term := range maps {
fmt.Println(term["user_id"], ":", term["name"])
}
需要注意的是,Golang ORM框架查询的时候需要新建一个查询结构体的指针作为参数传递给fid方法。
Go语言没有泛型,调用的时候得不到需要返回的类型信息,导致不能在find方法里面实例化对象。
这就是 beego 的简单使用了 。