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 驱动:

arduino 复制代码
go get -u gorm.io/gorm
go get -u gorm.io/driver/mysql

三、定义模型

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

go 复制代码
package main

import (
    "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.DB

func initDB() {
    dsn := "root:password@tcp(127.0.0.1:3306)/go_demo?charset=utf8mb4&parseTime=True&loc=Local"
    var err error
    db, err = gorm.Open(mysql.Open(dsn), &gorm.Config{})
    if err != nil {
        panic("连接数据库失败: " + err.Error())
    }
    fmt.Println("数据库连接成功!")

    // 自动迁移: 如果表不存在则创建,存在则更新字段
    db.AutoMigrate(&User{})
}

四、CRUD 操作

1. 插入数据(Create)

go 复制代码
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)

go 复制代码
func getUsers() {
    var users []User
    result := 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)
    }
}

也可以按条件查询:

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

3. 更新数据(Update)

go 复制代码
func updateUser(id uint, newAge int) {
    var user User
    db.First(&user, id)
    user.Age = newAge
    db.Save(&user)
    fmt.Printf("用户 %d 年龄已更新为 %d\n", id, newAge)
}

4. 删除数据(Delete)

go 复制代码
func deleteUser(id uint) {
    var user User
    db.Delete(&user, id)
    fmt.Printf("用户 %d 已删除\n", id)
}

五、完整示例

scss 复制代码
func main() {
    initDB()

    // 增
    createUser("Alice", 25)
    createUser("Bob", 30)

    // 查
    getUsers()

    // 改
    updateUser(1, 28)
    getUsers()

    // 删
    deleteUser(2)
    getUsers()
}

六、运行结果

makefile 复制代码
数据库连接成功!
新增用户成功, 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)、事务、钩子函数 等高级功能。
相关推荐
豆浆whisky21 分钟前
Go并发模式选择指南:找到最适合你项目的并发方案|Go语言进阶(19)
开发语言·后端·golang
Y***h1878 小时前
第二章 Spring中的Bean
java·后端·spring
稚辉君.MCA_P8_Java8 小时前
DeepSeek 插入排序
linux·后端·算法·架构·排序算法
t***p9358 小时前
idea创建SpringBoot自动创建Lombok无效果(解决)
spring boot·后端·intellij-idea
d***81729 小时前
解决SpringBoot项目启动错误:找不到或无法加载主类
java·spring boot·后端
无限大69 小时前
RBAC模型:像电影院选座一样管理权限,告别"一个用户配一个权限"的噩梦
后端
间彧9 小时前
在CI/CD流水线中如何集成自动化的发布验证和熔断机制?
后端
间彧9 小时前
如何处理蓝绿部署中的数据迁移和数据库版本兼容性问题?
后端
间彧9 小时前
什么是金丝雀/灰度发布
后端
间彧9 小时前
什么是蓝绿部署
后端