当前位置: 首页 > news >正文

Go基础:Go语言ORM框架GORM详解

文章目录

    • 一、GORM概述
      • 1.1 什么是GORM?
      • 1.2 GORM核心优势
      • 1.3 GORM的优缺点
      • 1.4 安装GORM
      • 1.5 GORM与其他ORM框架对比
    • 二、连接数据库
    • 三、模型定义
      • 3.1 基本模型
      • 3.2 模型标记(Tags)
    • 四、增删改查操作
      • 4.1 创建记录
      • 4.2 查询记录
      • 4.3 更新记录
      • 4.4 删除记录
    • 五、高级操作
      • 5.1 自动迁移
      • 5.2 事务支持
      • 5.3 关联关系
      • 5.4 钩子函数(Hooks)
      • 5.5 日志与调试

一、GORM概述

1.1 什么是GORM?

GORM(Go Object Relational Mapper) 是Go语言中一个功能强大且易于使用的ORM框架,它支持多种数据库,包括MySQL、PostgreSQL、SQLite等。旨在通过面向对象的方式与数据库进行交互。它提供了丰富的功能,如自动迁移、关联、钩子方法、事务支持等,使开发者可以更专注于业务逻辑而非底层SQL语句。

官方地址:https://gorm.io/docs/index.html

1.2 GORM核心优势

  1. 全功能ORM:支持几乎所有ORM功能,包括模型定义、CRUD操作、复杂查询、关联处理等。
  2. 多数据库支持:兼容MySQL、PostgreSQL、SQLite、SQL Server等主流数据库,便于切换。
  3. 关联关系支持:灵活支持一对一、一对多、多对多、多态等关联关系。
  4. 钩子函数(Hooks):允许在创建、更新、删除等操作前后执行自定义逻辑。
  5. 预加载(Eager Loading):通过PreloadJoins减少查询次数,提升性能。
  6. 事务管理:支持事务、嵌套事务、保存点及回滚到保存点,确保数据一致性。
  7. 批量操作:支持批量插入、分批次查询、通过Map进行CRUD操作。
  8. SQL构建器:提供Upsert、锁机制、子查询等高级SQL特性。
  9. 自动迁移:根据结构体定义自动同步数据库表结构。
  10. 插件扩展:支持自定义日志、回调、数据库方言等扩展功能。

1.3 GORM的优缺点

优点

  1. 开发者友好:提供简洁的API,降低学习成本。
  2. 功能丰富:支持自动迁移、事务、关联、钩子方法等。
  3. 多数据库支持:兼容MySQL、PostgreSQL、SQLite等多种数据库。
  4. 文档齐全:官方文档详细,且支持中文。

缺点

  1. 性能开销:ORM框架相比原生SQL有一定的性能损耗。
  2. 灵活性限制:复杂查询可能不如原生SQL灵活。

1.4 安装GORM

在开始使用GORM之前,需要安装GORM及其数据库驱动。以MySQL为例:
1、安装GORM

go get -u gorm.io/gorm

2、安装MySQL驱动

go get -u gorm.io/driver/mysql

1.5 GORM与其他ORM框架对比

特性GORMXORMGorp
性能中等
映射机制结构体+标签结构体+标签自定义映射
查询构建器丰富丰富简单
事务支持完善完善完善
扩展性

二、连接数据库

以下代码展示了如何使用GORM连接MySQL数据库:

package main
import ("fmt""gorm.io/driver/mysql""gorm.io/gorm"
)
func main() {dsn := "user:password@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local"db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})if err != nil {panic("failed to connect database")}fmt.Println("Database connected successfully!")
}

三、模型定义

GORM通过结构体与数据库表进行映射。以下是一个模型定义的示例:

3.1 基本模型

type User struct {gorm.Model        // 内嵌ID、CreatedAt、UpdatedAt、DeletedAt字段Name       string `gorm:"size:255;not null"`Age        intEmail      string `gorm:"uniqueIndex"`
}

3.2 模型标记(Tags)

GORM支持通过结构体标记定义字段的属性,例如:

  • gorm:"primaryKey":定义主键。
  • gorm:"not null":字段不可为空。
  • gorm:"uniqueIndex":唯一索引。

四、增删改查操作

4.1 创建记录

func createUser(db *gorm.DB) {user := User{Name: "Alice", Age: 25, Email: "alice@example.com"}result := db.Create(&user)if result.Error != nil {panic("failed to create user")}fmt.Printf("User created: %+v\n", user)
}

4.2 查询记录

func queryUser(db *gorm.DB) {var user User// 查询第一条记录db.First(&user, "name = ?", "Alice")fmt.Printf("User found: %+v\n", user)// 查询所有记录var users []Userdb.Find(&users)fmt.Printf("All users: %+v\n", users)
}

4.3 更新记录

func updateUser(db *gorm.DB) {db.Model(&User{}).Where("name = ?", "Alice").Update("Age", 30)fmt.Println("User updated successfully!")
}

4.4 删除记录

func deleteUser(db *gorm.DB) {db.Where("name = ?", "Alice").Delete(&User{})fmt.Println("User deleted successfully!")
}

五、高级操作

5.1 自动迁移

GORM支持自动迁移,可以自动创建或更新数据库表结构:

func autoMigrate(db *gorm.DB) {err := db.AutoMigrate(&User{})if err != nil {panic("failed to migrate database")}fmt.Println("Database migrated successfully!")
}

5.2 事务支持

GORM提供了事务支持,确保一组操作的原子性:

func transactionExample(db *gorm.DB) {err := db.Transaction(func(tx *gorm.DB) error {if err := tx.Create(&User{Name: "Bob", Age: 28}).Error; err != nil {return err}if err := tx.Create(&User{Name: "Charlie", Age: 32}).Error; err != nil {return err}return nil})if err != nil {panic("transaction failed")}fmt.Println("Transaction completed successfully!")
}

5.3 关联关系

// 一对多关系:User拥有多个CreditCard
type User struct {gorm.ModelCreditCards []CreditCard
}type CreditCard struct {gorm.ModelNumber stringUserID uint
}// 预加载关联数据
var user User
db.Preload("CreditCards").Find(&user)

5.4 钩子函数(Hooks)

func (u *User) BeforeCreate(tx *gorm.DB) (err error) {u.Name = "【新建】" + u.Namereturn
}

5.5 日志与调试

import "gorm.io/gorm/logger"db, _ := gorm.Open(mysql.Open(dsn), &gorm.Config{Logger: logger.Default.LogMode(logger.Info),  // 输出SQL日志
})

总结:GORM是一个功能强大且易于使用的Go语言ORM框架,通过它可以简化数据库操作,提高开发效率。

http://www.dtcms.com/a/445553.html

相关文章:

  • 备案 网站备注网站用的服务器多少钱
  • 《API网关在智能制造产线协同中的定制化实践与可靠性重构》
  • 建设网站的调研报告校园电子商务网站建设规划书实例
  • 书生浦语第六期 L1-G2000
  • AI大事记9:从 AlexNet 到 ChatGPT——深度学习的十年跃迁(上)
  • 删除无限递归文件夹
  • PyCharm 核心快捷键大全 (Windows版)
  • Android15 状态栏适配
  • 云原生微服务:Kubernetes+Istio 魔法学院实战指南
  • 做调研有哪些网站推广普通话手抄报内容大全资料
  • Vue.js 自定义指令
  • Vue中$nextTick的使用
  • 【Linux系列】并发世界的基石:透彻理解 Linux 进程 — 进程状态
  • 开源 C++ QT QML 开发(四)复杂控件--Listview
  • 我朋友是做卖网站的八戒影视大全
  • 智能体模式(Agent Mode)与深度研究(Deep Research)概念学习
  • AI vs. Machine Learning vs. Deep Learning vs. Neural Networks
  • 什么网站个人可以建设做企业门户网站都
  • 深度学习(十四):正则化与L2正则化
  • 深入浅出 ArkTS:构建响应式 HarmonyOS 应用的现代语法与实践
  • react生态
  • 深度学习周报(9.29~10.5)
  • 【开题答辩全过程】以 ssm框架的智能校园服务系统为例,包含答辩的问题和答案
  • [论文阅读] (42)ASC25 基于大语言模型的未知Web攻击威胁检测
  • 长宁网站设计wordpress极速版
  • Linux - 进程状态
  • 基于selenium库的爬虫实战:京东手机数据爬取
  • 少儿编程:课程体系和学习计划
  • 江苏盐城网站开发wordpress添加版块
  • 【Linux】安装配置mysql中出现的问题2