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

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

ruisui885个月前 (01-21)技术分析48

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

扫描二维码推送至手机访问。

版权声明:本文由ruisui88发布,如需转载请注明出处。

本文链接:http://www.ruisui88.com/post/446.html

标签: c# orm框架
分享给朋友:

“Golang 入门系列(十一)orm框架之gorm详细介绍” 的相关文章

【幼儿园收费管理系统】——中小型幼儿园收费管理的好帮手!

为了让幼儿园收费管理更加高效、便捷,我们推出了《幼儿园收费管理系统》!这款软件专为中小型幼儿园设计,集基础信息、幼儿管理、收费管理、车辆管理、生日提醒、报表统计等功能于一身,是您管理幼儿园的得力助手!一、基础设置:一款好的软件,首先要让您轻松上手。我们的系统提供了幼儿园信息、年级设置、班级设置、餐...

2021最全VUE面试题,奥利给

1. vue-router用过没,哪些常用的钩子函数路由钩子的执行流程,钩子函数种类有:全局守卫、路由守卫、组件守卫。首页可以控制导航跳转, beforeEach , afterEach 等,?般?于页? title 的修改。?些需要登录才能调整??的重定向功能。beforeEach 主要有3个参数...

代码管理-9-gitlab的使用和设置

gitlab使用1、外观设置完成后保存,返回登录页面查看关于注册,有些公司是不允许打开的,,有些人数非常多的公司就需要打开注册的功能,让人员自己注册,我们来给他特定的权限就可以,毕竟人非常多的时候还由我们来给她们注册就非常不现实了,工作量会很大2、自动注册3、组&用户&项目创建组设置组名称、描述等创...

「Git迁移」三行命令迁移Git包含提交历史,分支,tag标签等信息

问题描述:公司需要将一个git远程服务器的全部已有项目迁移到一台新服务器的Gitlab中,其中需要包含全部的提交纪录,已有的全部分支与全部打tag标签,目前此工作已全部迁移完毕,特此记录一下操作步骤环境描述:1. 要迁移的远程Git:Gitblit2. 迁移目的Git:Gitlab3. 暂存代码的P...

使用cgroup限制进程资源

这里使用containerd项目中的cgroup包来实现进程资源限制。先写一个耗费一个CPU并且一秒增加10m内存的测试进程package mainimport ( "fmt" "math/rand" "time")func main() { go f...

Gemini应用在Android上广泛推出2.0闪电模式切换器

#头条精品计划# 快速导读谷歌(搜索)应用的测试频道在安卓设备的双子应用中推出了2.0闪电实验功能,现已向稳定用户开放。双子应用通过谷歌应用运行,目前推出的15.50版本中,用户可通过模型选择器体验不同选项,包括1.5专业版、1.5闪电版和2.0闪电实验版。2.0闪电实验模型提供了更快的响应速度和优...