一文搞懂Gorm | 青训营

160 阅读3分钟

在学习Gorm之前,我们要先了解什么是ORM。

什么是ORM

ORM是Object Relational Mapping的缩写,就是"对象关系映射',它解决了对像和关系型数库之间 的数据交互问题。它的目的是提供一种简化数据库操作的方式,将数据库表的数据映射到编程语言中的对象,从而使开发人员能够使用面向对象的方式进行数据库操作,而不必直接编写复杂的SQL语句。

简单说就是使用一个类表示一张表,类中的属性表示表的字段,类的实例化对象表示一条记录

ORM优点

  • 简化开发:ORM框架隐藏了底层数据库的细节,开发人员可以使用面向对象的方式进行数据库操作,提高开发效率和代码可读性。
  • 跨数据库支持:ORM框架可以支持多种数据库,开发人员无需关注具体的数据库实现细节,可以方便地切换和迁移数据库。
  • 数据库抽象层:ORM框架提供了数据库抽象层,使得应用程序的业务逻辑与底层数据库解耦,方便进行单元测试和模块化开发。

ORM缺点

  • 学习曲线和复杂性:ORM框架通常有一定的学习曲线,需要了解其工作原理和配置方式。一些复杂的查询或特定数据库操作可能需要学习框架的高级功能和技巧。
  • 性能问题:在处理大规模数据和复杂查询时,ORM框架可能无法达到直接使用原生SQL的效率。
  • 限制和局限性:ORM框架在封装数据库细节的同时,也可能限制了某些数据库特性的使用。对于一些特殊需求或复杂的数据库模型需要使用原生SQL进行处理。
  • 过度抽象和性能问题:某些ORM框架可能过度抽象数据库操作,导致开发人员无法全面控制底层SQL语句的生成和优化,从而影响性能。

什么是GORM

GORM是Go语言中一款流行的ORM框架,它提供了简洁且强大的数据库操作功能。GORM文档

快速安装

go get -u gorm.io/gorm

go get -u gorm.io/driver/sqlite

具体用法可看 GORM文档

什么是GROM-GEN

GEN 是更友好 & 更安全的 GORM 代码生成工具,能更好生成curd代码。

安装

go get -u gorm.io/gen

快速开始

package main

import "gorm.io/gen"

// Dynamic SQL
type Querier interface {
  // SELECT * FROM @@table WHERE name = @name{{if role !=""}} AND role = @role{{end}}
  FilterWithNameAndRole(name, role string) ([]gen.T, error)
}

func main() {
  g := gen.NewGenerator(gen.Config{
    OutPath: "../query",
    ModelPkgPath: "./model",
    Mode: gen.WithoutContext|gen.WithDefaultQuery|gen.WithQueryInterface, // generate mode
  })
  
  // gormdb, _ := gorm.Open(mysql.Open("root:@(127.0.0.1:3306)/demo?charset=utf8mb4&parseTime=True&loc=Local"))
  g.UseDB(gormdb) // reuse your gorm db

  // Generate basic type-safe DAO API for struct `model.User` following conventions
  g.ApplyBasic(model.User{})

  // Generate Type Safe API with Dynamic SQL defined on Querier interface for `model.User` and `model.Company`
  g.ApplyInterface(func(Querier){}, model.User{}, model.Company{})

  // Generate the code
  g.Execute()
}

生成代码

go run main.go

使用生成的代码

import "your_project/query"

func main() {
  // Basic DAO API
  user, err := query.User.Where(u.Name.Eq("modi")).First()

  // Dynamic SQL API
  users, err := query.User.FilterWithNameAndRole("modi", "admin")
}