深入解析Golang:ORM框架gorm的详细介绍(十二)

发表时间: 2020-04-11 17:29

之前在已经介绍了用的
github.com/go-sql-driver/mysql 访问数据库,不清楚的朋友可以看看之前的文章 。实际上,为提高开发效率,一般都会使用一些orm框架,把数据库层屏蔽,用户看到的只有对象而无需我们手动做一些转换,这样在使用的时候就非常方便。这种操作方式基本上已经成了标准做法。golang也有很多优秀的orm框架,今天就来介绍介绍gorm。

为什么要使用orm? gorm 跟其他框架有什么不一样?相信网上的文章已经讲过很多次,这里就不在介绍了。下面我就以普通的产品模块为例,介绍一下 gorm 的用法,分享关注(章为忠学架构)获取完整代码。


库安装

go get -u github.com/jinzhu/gorm


数据库连接

首先创建数据库连接

连接比较简单,直接调用 gorm.Open 传入数据库地址即可。gorm支持基本上所有主流的关系数据库,只是连接方式上略有不同,这里我用的 mysql为例吧。


实体类

首先需要定义实体类,这个实体类包含变量名称及对应的数据库字段类型和长度。通过gorm的映射指定对应表的列

type Product struct {    ID        int    `gorm:"primary_key"`    Code      string `gorm:"type:varchar(20);"`    Price     int     `gorm:"type:int;"`    Name      string `gorm:"type:varchar(64);"`    Mail      string `gorm:"type:varchar(256);"`    CreatedAt time.Time}


创建表

直接通过 db.CreateTable 就可以创建表了,非常方便,还可以通过 db.Set 设置一些额外的表属性。

if !db.HasTable(&Like{}) {    if err := db.Set("gorm:table_options", "ENGINE=InnoDB DEFAULT CHARSET=utf8").CreateTable(&Product{}).Error; err != nil {      panic(err)    }}

另外,还有自动同步创建表的方法:

// 自动迁移模式db.AutoMigrate(&Product{})


查询

如果简单查询当个记录,可以使用 db.Find(&Likes) 或者只需要查一条记录 db.First(&Like)。

复杂查询也特别简单,先用 db.Model() 选择一个表,再用 db.Where() 构造查询条件,后面可以使用 db.Count() 计算数量。

// 简单查询var product Productdb.First(&product, 1) // 查询id为1的productdb.First(&product, "code = ?", "ik01001") // 查询code为l1212的product// 复杂查询var count interr := db.Model(&Like{}).Where(&Product{code: "ik01001"}).Count(&count).Errorif err != nil {    return false, err}


插入

构造已给对象,直接调用 db.Create() 就可以插入一条记录。不用拼接sql语句,是不是很方便。

// 创建db.Create(&Product{Code: "ik01001", Price: 1000})


更新

// 更新 - 更新product的price为2000db.Model(&product).Update("Price", 2000)

第一个是更新单条记录和对应的字段;第二个则是更新整条记录,注意只有非空字段才会更新。


删除

简单对象删除,直接创建一个对象即可:

db.Delete(&product)

复杂条件的删除,先用 db.Where() 构造查询条件,再调用 db.Delete() 就可以删除:

if err := db.Where(&Product{ID: 1}).Delete(Product{}).Error; err != nil {  return err}


错误处理

其实你已经看到了,这里基本上所有的函数都是链式的,全部都返回 db 对象,任何时候调用 db.Error 就能获取到错误信息,非常方便。


事务

func CreateProducts(db *gorm.DB) err {  tx := db.Begin()  // 注意,一旦你在一个事务中,使用tx作为数据库句柄  if err := tx.Create(&Product{Code: "ik01003", Price: 3000}).Error; err != nil {    tx.Rollback()    return err  }  tx.Commit()  return nil}

事务的处理也很简单,用 db.Begin() 声明开启事务,结束的时候调用 tx.Commit(),异常的时候调用 tx.Rollback()。


最后

以上就把基本的增删改查介绍完了,实际使用中还有很多高级的用法,比如关联查询,主外键设置等。大家可以看看官方的使用说明:
http://gorm.book.jasperxu.com/ 。分享关注(
章为忠学架构)获取完整代码。


推荐阅读:

Golang 入门系列(十一)从零开始实现一个完整的webapi项目!

Golang 入门系列(八)如何实现定时任务,极简版!

Golang 入门系列(六)理解Go协程Goroutine,这篇就够了!

Golang 入门系列(四)Golang中的interface,一看就明白

Golang 入门系列(三)打好基本功: Golang 语法基础!

SpringBoot入门系列(一)如何快速创建SpringBoot项目

Nginx总结(六)nginx实现负载均衡