七叶笔记 » golang编程 » Golang 入门系列(十一)orm框架之gorm详细介绍

Golang 入门系列(十一)orm框架之gorm详细介绍

之前在已经介绍了用的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(∏{})  

查询

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

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

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

插入

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

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

更新

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

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

删除

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

 db.Delete(&product)  

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

 if err := db.Where(∏{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(∏{Code: "ik01003", Price: 3000}).Error; err != nil {
    tx.Rollback()
    return err
  }

  tx. Commit ()
  return nil
}  

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

最后

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

推荐阅读:

相关文章