Go整合gorm实现CRUD

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: Go整合gorm实现CRUD

1 gorm简介

官网:gorm.io/zh_CN/

Github:github.com/go-gorm/gor…

中文文档:gorm.io/zh_CN/docs/

特性(摘自官网):

  • 全功能 ORM
  • 关联 (Has One,Has Many,Belongs To,Many To Many,多态,单表继承)
  • Create,Save,Update,Delete,Find 中钩子方法
  • 支持 PreloadJoins 的预加载
  • 事务,嵌套事务,Save Point,Rollback To Saved Point
  • Context、预编译模式、DryRun 模式
  • 批量插入,FindInBatches,Find/Create with Map,使用 SQL 表达式、Context Valuer 进行 CRUD
  • SQL 构建器,Upsert,数据库锁,Optimizer/Index/Comment Hint,命名参数,子查询
  • 复合主键,索引,约束
  • Auto Migration
  • 自定义 Logger
  • 灵活的可扩展插件 API:Database Resolver(多数据库,读写分离)、Prometheus…
  • 每个特性都经过了测试的重重考验
  • 开发者友好

2 为什么要引入ORM框架

2.1 概念

ORM一般指对象关系映射。 对象关系映射(英语:Object Relational Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序设计技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换。

2.2 引入orm之前的CRUD

var mysqlCon *sql.DB
func InitMySQL(cnf *model.MySQLConfig) {
   var err error
   source := cnf.GetUserName() + ":" + cnf.PassWord + "@tcp(" + cnf.Host + ":" + cnf.GetPort() + ")/" + cnf.GetDBName() + "?charset=utf8"
   mysqlCon, err = sql.Open("mysql", source)
   if err != nil {
      panic("连接失败")
   }
   log.Info("MySQL Server is connected...")
}
func (dao LogMessageDaoImpl) SaveLogMessage(ctx context.Context, ms model.LogMessage) bool {
  tx, err := mysqlCon.Begin()
  stmt, err := tx.Prepare("INSERT  INTO tb_log_message(id,create_time,time_stamp,log_user_id,log_user_role,topic_id,topic_name,operation,state,user_token,ip_address,os,browser) VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?)")
  if err != nil {
    fmt.Println("save err")
  }
  stmt.Exec(ms.Id, ms.CreateTime, ms.TimeStamp, ms.LogUserId, ms.LogUserRole, ms.TopicId, ms.TopicName, ms.Operation, ms.State, ms.UserToken, ms.IpAddress, ms.OS, ms.Browser)
  tx.Commit()
  return false
}
复制代码

2.3 使用orm框架进行CRUD

func main() {
   // 参考 https://github.com/go-sql-driver/mysql#dsn-data-source-name 获取详情
   dsn := "root:12345678@tcp(127.0.0.1:3306)/test?charset=utf8mb4&parseTime=True&loc=Local"
   db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
   if err != nil {
      panic(err)
   }
   //ORM操作
   GormCreate(db)
}
func GormCreate(db *gorm.DB) {
   //create
   student := Student{Name: "sss", Age: 10, Address: "Guangzhou"}
   res := db.Create(&student)
   fmt.Println(student.Id)
   fmt.Println(res.Error)
}
复制代码

2.4 原因

  • 操作对象,就相当于直接操作数据库表,不需要占位符
  • 代码量少不易出错

3 gorm简单使用

package main
import (
   "fmt"
   "gorm.io/driver/mysql"
   "gorm.io/gorm"
   "time"
)
type Student struct {
   Id      int
   Name    string
   Age     int
   Address string
}
// TableName 实现接口就可以更改表名
func (stu Student) TableName() string {
   return "student"
}
func main() {
   // 参考 https://github.com/go-sql-driver/mysql#dsn-data-source-name 获取详情
   dsn := "root:12345678@tcp(127.0.0.1:3306)/test?charset=utf8mb4&parseTime=True&loc=Local"
   db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
   if err != nil {
      panic(err)
   }
   //ORM操作
   //GormCreate(db)
   GormUpdate(db)
}
func GormCreate(db *gorm.DB) {
   //create
   student := Student{Name: "sss", Age: 10, Address: "Guangzhou"}
   res := db.Create(&student)
   fmt.Println(student.Id)
   fmt.Println(res.Error)
}
func GormRead(db *gorm.DB) {
   //Select
   var stu Student
   db.First(&stu, 1)
   fmt.Println(stu)
}
func GormUpdate(db *gorm.DB) {
   stu := Student{Id: 1}
   // Update - 将 product 的 price 更新为 200
   db.Model(&stu).Update("age", 200)
   // Update - 更新多个字段
   db.Model(&stu).Updates(Student{Name: "ZhangSan", Address: "F42"}) // 仅更新非零值字段
   //db.Model(&stu).Updates(map[string]interface{}{"Price": 200, "Code": "F42"})
}
func GormDelete(db *gorm.DB) {
   stu := Student{}
   // Delete - 删除 product
   db.Delete(&stu, 1)
}


相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
1月前
|
Go API 数据库
Go 语言中常用的 ORM 框架,如 GORM、XORM 和 BeeORM,分析了它们的特点、优势及不足,并从功能特性、性能表现、易用性和社区活跃度等方面进行了比较,旨在帮助开发者根据项目需求选择合适的 ORM 框架。
本文介绍了 Go 语言中常用的 ORM 框架,如 GORM、XORM 和 BeeORM,分析了它们的特点、优势及不足,并从功能特性、性能表现、易用性和社区活跃度等方面进行了比较,旨在帮助开发者根据项目需求选择合适的 ORM 框架。
107 4
|
4月前
|
SQL JSON Go
Go - 基于 GORM 获取当前请求所执行的 SQL 信息
Go - 基于 GORM 获取当前请求所执行的 SQL 信息
80 3
|
7月前
|
存储 关系型数据库 MySQL
|
6月前
|
Go 数据库
Go语言之GORM框架(四)——预加载,关联标签与多态关联,自定义数据类型与事务(完结篇)
Go语言之GORM框架(四)——预加载,关联标签与多态关联,自定义数据类型与事务(完结篇)
|
6月前
|
SQL Go
Go语言之GORM框架(三)——Hook(钩子)与Gorm的高级查询
Go语言之GORM框架(三)——Hook(钩子)与Gorm的高级查询
106 0
|
6月前
|
SQL Go 数据库
Go语言之GORM框架(二) ——GORM的单表操作
Go语言之GORM框架(二) ——GORM的单表操作
|
6月前
|
SQL 关系型数据库 MySQL
Go语言之Gorm框架(一) ——初窥Gorm框架
Go语言之Gorm框架(一) ——初窥Gorm框架
148 0
|
关系型数据库 测试技术 Go
Go语言微服务框架 - 5.GORM库的适配sqlmock的单元测试
与此同时,我们也缺乏一个有效的手段来验证自己编写的相关代码。如果依靠连接到真实的MySQL去验证功能,那成本实在太高。那么,这里我们就引入一个经典的sqlmock框架,并配合对数据库相关代码的修改,来实现相关代码的可测试性。
153 0
|
7月前
|
SQL Go 数据库
GORM入门到精通:构建高效Go应用的终极指南
在Go语言的世界里,数据持久化是一个不可或缺的话题。随着应用的复杂性增加,传统的数据库操作方式已经无法满足开发者对效率和便捷性的需求。这时,ORM(对象关系映射)框架应运而生,它将数据库表与对象模型之间建立映射,极大地简化了数据库操作。而在众多ORM框架中,GORM以其简洁、高效和功能丰富脱颖而出,成为了Go开发者的新宠。
|
前端开发 Java 数据库连接
基于Gin+Gorm框架搭建MVC模式的Go语言企业级后端系统
基于Gin+Gorm框架搭建MVC模式的Go语言企业级后端系统
242 0