之前在已经介绍了用的
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实现负载均衡