Go框架三件套详解——ORM | 青训营

125 阅读5分钟

1 什么是ORM?它有什么作用?

ORM (Object-Relational Mapping) 是一种编程技术,用于将对象模型和关系数据库之间进行映射。通过使用ORM,开发人员可以使用面向对象的编程语言操作数据库,而不需要直接编写SQL语句。

 ORM (全称为 :Object Relative Mapping)对象-关系映射,关系数据库是企业级应用环境中永久存放数据的主流数据存储系统。对象和关系数据是业务实体的两种表现形式,业务实体在内存中表现为对象,在数据库中表现为关系数据。内存中的对象之间存在关联和继承关系,而在数据库中,关系数据无法直接表达多对多关联和继承关系。因此,对象-关系映射(ORM)系统一般以中间件的形式存在,主要实现程序对象到关系数据库数据的映射。  

优点:

ORM在软件开发中有很多优点,例如简化了数据库操作,提高了开发效率,减少了代码重复,更易于维护和扩展。它将数据库表映射为对象类,使得开发人员可以使用面向对象的思维来处理数据。

常见ORM框架:

常见的ORM框架包括Hibernate(Java)Entity Framework (.NET)Django ORM (Python)Rails ActiveRecord (Ruby)Gorm(Go)等。这些框架提供了丰富的功能,如自动生成SQL语句、事务管理、缓存等,使开发人员能够更加专注于业务逻辑的实现。

小结: orm可以实现利用对象操纵数据库中的表。

2 GORM框架简介

GORM 是一个已经迭代了10+年的功能强大的 ORM 框架,在字节内部被广泛使用并且拥有非常丰富的开源扩展。

GORM 是一个在 Go 语言中使用的 ORM(对象关系映射)库,它提供了简单且强大的数据库操作功能。GORM 的全称是 Go Object Relational Mapping,它允许开发者通过定义结构体和标签来映射数据库中的表和字段,使得开发者能够使用面向对象的方式来操作数据库。

通过 GORM,你可以方便地进行数据库的增删改查操作,支持多种数据库,如 MySQLPostgreSQLSQLite 等,并且提供了一系列功能强大的查询方法和链式操作,如条件查询、排序、分页等。此外,GORM 还支持事务处理、关联查询、预加载等高级功能,使得数据操作更加灵活和高效。

3 GORM的基础使用

对于使用 GORM 进行数据库操作,你可以先定义一个与数据库表对应的结构体,并在结构体的字段上使用标签指定数据库表和字段的映射关系。然后,通过 GORM 提供的 API 来执行增删改查操作。例如,你可以使用 Create 方法插入一条记录,使用 Find 方法查询数据,使用 Update 方法更新数据等。

官方指南:

GORM 指南 | GORM - The fantastic ORM library for Golang, aims to be developer friendly.

3.1 Gorm 的约定:

  1. Gorm 使用名为 ID 的字段作为主键。
  2. 如果没有定义 TableName() 方法,使用结构体的蛇形复数作为表名。
  3. 列名为字段名的蛇形小写。
  4. 使用 CreatedAtUpdatedAt 字段作为创建、更新时间。

3.2 Gorm 支持的数据库:

Gorm 目前支持 MySQLSQLServerPostgreSQLSQLiteGorm 通过驱动来连接数据库,如果需要连接其它类型的数据库,可以复用/自行开发驱动。  

3.3 CRUD操作

package main

import (

  "gorm.io/gorm"

  "gorm.io/driver/sqlite"

)

// 定义 gorm.Model 结构体,对应数据库中一张表

type Product struct {

  gorm.Model // 也可以直接定义 Deleted gorm.DeletedAt

  Code  string  `gorm:"default:D42"`  // 设置默认值

  Price uint    `gorm:"default:200"`

}

// 为 model 定义表名

func (p Product) TableName() string {

    return "product"

}

func main() {

  // 参考 https://github.com/go-sql-driver/mysql#dsn-data-source-name 获取详情

  dsn := "user:pass@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local"

  // 连接 MYSQL 数据库 https://gorm.cn/zh_CN/docs/connecting_to_the_database.html

  db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{

      // 提高性能

      SkipDefaultTransaction: true,  // 关闭默认事务

      PrepareStmttrue,             // 缓存预编译语句

  })

  if err != nil {

    panic("failed to connect database")

  }

  // 迁移 schema

  db.AutoMigrate(&Product{})

Create 创建数据

  db.Create(\&Product{Code: "D42", Price: 100})   // 一条数据:创建对象

  product := \[]\*Product{{Code: "D41"}, {Code: "D42"}, {Code: "D43"}}  // 多条数据:创建切片

  db.Create(\&product)

Read 查询数据

  var product Product

  // 查询单条数据

  db.First(\&product)  // 获取第一条记录(主键升序),没有找到记录时返回 ErrRecordNotFound 错误

  db.First(\&product, 1) // 传递整形:根据整形主键查找

  db.First(\&product, "code = ?", "D42") // 传递查询条件:查找 Code 字段值为 D42 的记录

  // 使用 Find 查询多条数据,不会返回错误

  db.Where("code = ?", "D42").Find(\&product) // SELECT \* FROM product WHERE code = 'D42';

 Update 更新数据

db.Model(\&product).Where("code = ?", "D42").Update("Price", 200) // 更新单个字段

  // 更新多个字段

  db.Model(\&product).Updates(Product{Price: 200, Code: "F42"}) // 仅更新非零值字段

  db.Model(\&product).Updates(map\[string]interface{}{"Price": 200, "Code": "F42"}) // 可更新零值字段

  Delete - 删除数据

// 物理删除:删没了

  db.Delete(\&product, 1) // 传递整形:根据整形主键删除

  db.Delete(\&product, "code = ?", "D42") // DELETE FROM product WHERE code = 'D42';

  // 软删除:GORM 会将 DeletedAt 置为当前时间, 不能再通过正常的查询方法找到该记录。

  db.Where("code = ?", "D42").Delete(\&Product{}) // UPDATE product SET deleted\_at="2023-01-20 10:23" WHERE code = 'D42';

  db.Unscoped().Where("code = ?", "D42").Find(\&product) // 使用 Unscoped 找到被软删除的记录

}

3.4 GORM事务

Gorm 提供了 BeginCommitRollback 方法用于使用事务。

// Transaction 用于自动提交事务,避免漏写 Rollback()、Commit()

db.Transaction(func(tx \*gorm.DB) error {

  // 在事务中执行一些 db 操作(从这里开始,您应该使用 'tx' 而不是 'db')

  if err := tx.Create(\&Animal{Name: "Giraffe"}).Error; err != nil {

    // 返回任何错误都会回滚事务

    return err

  }

  if err := tx.Create(\&Animal{Name: "Lion"}).Error; err != nil {

    return err

  }

  // 返回 nil 提交事务

  return nil

})

3.5 GORM扩展生态

image.png

总结

总之,GORM 是一个功能丰富而易于使用的 ORM 库,它简化了在 Go 语言中与数据库进行交互的过程,并提供了许多便捷的操作方法。