当前位置:首页 > 技术文章 > 正文内容

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

zonemu2个月前 (08-16)技术文章35

之前在已经介绍了用的
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 Product
db.First(&product, 1) // 查询id为1的product
db.First(&product, "code = ?", "ik01001") // 查询code为l1212的product
// 复杂查询
var count int
err := db.Model(&Like{}).Where(&Product{code: "ik01001"}).Count(&count).Error
if err != nil {
    return false, err
}


插入

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

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


更新

// 更新 - 更新product的price为2000
db.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实现负载均衡

相关文章

Linux之父:Linux内核5.8是“我们有史以来最大的发行版之一”

Linux内核负责人Linus Torvalds对Linux内核版本5.8的第一个候选发布版本(rc1)看得出来还是挺满意的,该版本包含80万行新代码行和超过14,000个更改的文件,占内核文件检修的...

Vue3开发极简入门(15.1):emits补完-结合v-model

之前代码是通过按钮触发emit,如果希望输入框里的内容在输入之后也能同步到父组件,就可以结合v-model的update事件来操作,具体如下。Son2.vue:<template>...

前端React面试基础系列(React基础篇)

本文阅读8分钟,喜欢的小伙伴可以持续关系小编哦1. 什么是受控组件和非受控组件?受控组件像表单元素在用户输入时,像<input> <select>等元素需要绑定一个 chang...

同事git push到主分支上了,技术总监怒了

事情是这样的,同事前几天提交使用git提交代码的时候不小心提交到主分支上了,关键还提交成功了,这可是他自己开发的模块,还没测试的呢。技术总监也知道了,这下他慌乱了。最后还是技术总监给他兜底了。为了防止...

gitlab简单搭建与应用(gitlab怎么用)

一、gitlab1、简介GitLab是利用Ruby on Rails一个开源的版本管理系统,实现一个自托管的Git项目仓库,可通过Web界面进行访问公开的或者私人项目。与Github类似,GitLab...

编写简单的.gitlab-ci.yml打包部署项目

服务器说明:192.168.192.120:项目服务器192.168.192.121:GitLab为了可以使用gitlab的cicd功能,我们需要先安装GitLab Runner安装GitLab Ru...