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嵌入等),如下图所示。

go语言高并发tcp go语言高并发与微服务_ORM

以上为 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进行对象的增删改查,代码如下:

go语言高并发tcp go语言高并发与微服务_ORM_02

先把数据库中的表干掉了

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)
}

运行输出结果:

go语言高并发tcp go语言高并发与微服务_golang_03

可以看到,程序首先执行了数据表的创建,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 的简单使用了 。