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

Go语言实战案例-使用ORM框架 GORM 入门

在前几篇中我们通过 database/sql 直接操作 MySQL,实现了数据库连接和基本的 CRUD。但在实际开发中,直接写 SQL 语句容易冗余、不易维护。
为此,我们可以使用 ORM(对象关系映射,Object-Relational Mapping)框架来简化数据库操作。

GORM 是 Go 语言生态中最流行的 ORM 框架,功能强大,社区活跃,支持 MySQL、PostgreSQL、SQLite、SQL Server 等多种数据库。


一、GORM 简介

  • • ORM 的核心思想是:把数据库的表映射为 Go 结构体,把表中的记录映射为结构体实例。
  • • 使用 ORM,可以直接操作对象,而不是写大量 SQL。
  • • GORM 提供了 自动迁移、链式查询、关联关系、事务 等功能。

二、安装 GORM

在项目中安装 GORM 和 MySQL 驱动:

go get -u gorm.io/gorm
go get -u gorm.io/driver/mysql

三、定义模型

我们以 User 表为例,定义一个 Go 结构体模型:

package mainimport ("fmt""gorm.io/driver/mysql""gorm.io/gorm"
)type User struct {ID   uint   `gorm:"primaryKey"`Name string `gorm:"size:50"`Age  int
}var db *gorm.DBfunc initDB() {dsn := "root:password@tcp(127.0.0.1:3306)/go_demo?charset=utf8mb4&parseTime=True&loc=Local"var err errordb, err = gorm.Open(mysql.Open(dsn), &gorm.Config{})if err != nil {panic("连接数据库失败: " + err.Error())}fmt.Println("数据库连接成功!")// 自动迁移: 如果表不存在则创建,存在则更新字段db.AutoMigrate(&User{})
}

四、CRUD 操作

1. 插入数据(Create)

func createUser(name string, age int) {user := User{Name: name, Age: age}result := db.Create(&user)if result.Error != nil {fmt.Println("插入失败:", result.Error)} else {fmt.Printf("新增用户成功, ID = %d\n", user.ID)}
}

2. 查询数据(Read)

func getUsers() {var users []Userresult := db.Find(&users)if result.Error != nil {fmt.Println("查询失败:", result.Error)return}fmt.Println("用户列表:")for _, u := range users {fmt.Printf("ID: %d, 姓名: %s, 年龄: %d\n", u.ID, u.Name, u.Age)}
}

也可以按条件查询:

var user User
db.First(&user, 1)              // 按主键查询
db.First(&user, "name = ?", "Alice") // 按条件查询

3. 更新数据(Update)

func updateUser(id uint, newAge int) {var user Userdb.First(&user, id)user.Age = newAgedb.Save(&user)fmt.Printf("用户 %d 年龄已更新为 %d\n", id, newAge)
}

4. 删除数据(Delete)

func deleteUser(id uint) {var user Userdb.Delete(&user, id)fmt.Printf("用户 %d 已删除\n", id)
}

五、完整示例

func main() {initDB()// 增createUser("Alice", 25)createUser("Bob", 30)// 查getUsers()// 改updateUser(1, 28)getUsers()// 删deleteUser(2)getUsers()
}

六、运行结果

数据库连接成功!
新增用户成功, ID = 1
新增用户成功, ID = 2
用户列表:
ID: 1, 姓名: Alice, 年龄: 25
ID: 2, 姓名: Bob, 年龄: 30
用户 1 年龄已更新为 28
用户列表:
ID: 1, 姓名: Alice, 年龄: 28
ID: 2, 姓名: Bob, 年龄: 30
用户 2 已删除
用户列表:
ID: 1, 姓名: Alice, 年龄: 28

七、总结

  • • GORM 让数据库操作更面向对象,减少 SQL 拼接的负担。
  • • 核心步骤:定义模型 → 连接数据库 → 自动迁移 → CRUD
  • • 在实际开发中,可以进一步使用 关联关系(Has One、Has Many、Many To Many)、事务、钩子函数 等高级功能。

http://www.xdnf.cn/news/18206.html

相关文章:

  • Centos 更新/修改宝塔版本
  • GaussDB 数据库架构师修炼(十三)安全管理(5)-全密态数据库
  • 【架构师从入门到进阶】第五章:DNSCDN网关优化思路——第十二节:网关安全-信息过滤
  • 哈希表与unorder_set,unorder_map的学习
  • 【Linux系列】常见查看服务器 IP 的方法
  • 深入了解 Filesystem Hierarchy Standard (FHS) 3.0 规范
  • 17.5 展示购物车缩略信息
  • 【Linux】文件基础IO
  • Google Earth Engine | (GEE)逐月下载的MODIS叶面积指数LAI
  • Rust 入门 生命周期(十八)
  • 【牛客刷题】字符串按索引二进制1个数奇偶性转换大小写
  • C#高级语法_委托
  • java基础(十)sql的mvcc
  • 字节 Golang 大模型应用开发框架 Eino简介
  • 进程互斥的硬件实现方法
  • 私人AI搜索新突破:3步本地部署Dify+Ollama+QwQ,搜索能力MAX
  • 《动手学深度学习v2》学习笔记 | 1. 引言
  • Nacos 注册中心学习笔记
  • C++入门自学Day11-- String, Vector, List 复习
  • Kafka 面试题及详细答案100道(23-35)-- 核心机制2
  • 3D打印——给开发板做外壳
  • 最新技术论坛技术动态综述
  • XF 306-2025 阻燃耐火电线电缆检测
  • 【Linux | 网络】高级IO
  • JMeter(进阶篇)
  • (一)Python + 地球信息科学与技术 (GeoICT)=?
  • CentOS7安装部署GitLab社区版
  • 第3章 Java NIO核心详解
  • Portkey-AI gateway 的一次“假压缩头”翻车的完整排障记:由 httpx 解压异常引发的根因分析
  • java八股文-(spring cloud)微服务篇-参考回答