Go 语言数据库操作|GORM 实现 CRUD 超详细实战

🏷️ 标签:Go GORM MySQL CRUD ORM Go后端 数据库实战 📝 适用人群:Go 初学者、GORM 新手、需要快速实现数据库增删改查的开发者 💡 核心亮点:纯实战、零废话、代码可直接复制运行、自带生产规范,完美适配 CSDN 发布


一、前言

在 Go 后端开发中,GORM 是目前最主流、最稳定的 ORM 框架。相比于原生 database/sql,GORM 让我们不用手写 SQL ,通过结构体就能轻松完成数据库 CRUD(增删改查)

本文带你从 0 到 1 掌握 GORM 最核心的 CRUD 操作,包含:

  • 环境安装
  • 数据库连接
  • 模型定义
  • 单条 / 批量增删改查
  • 条件查询、分页、排序
  • 软删除
  • 生产最佳实践

全程可直接复制运行,可直接发布 CSDN!


二、环境准备

2.1 安装 GORM 与 MySQL 驱动

复制代码
# 安装 GORM V2 核心库
go get gorm.io/gorm

# 安装 MySQL 驱动
go get gorm.io/driver/mysql

2.2 创建测试表

我们以 user 表为例:

复制代码
CREATE TABLE `user` (
  `id` int NOT NULL AUTO_INCREMENT,
  `name` varchar(50) NOT NULL,
  `age` int NOT NULL,
  `email` varchar(100) DEFAULT NULL,
  `created_at` datetime NOT NULL,
  `updated_at` datetime NOT NULL,
  `deleted_at` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

三、连接数据库(必看)

3.1 数据库连接代码

复制代码
package main

import (
  "gorm.io/driver/mysql"
  "gorm.io/gorm"
  "gorm.io/gorm/logger"
  "time"
)

// 全局 DB 对象
var db *gorm.DB

func initDB() {
  dsn := "root:你的密码@tcp(127.0.0.1:3306)/testdb?charset=utf8mb4&parseTime=True&loc=Local"

  var err error
  db, err = gorm.Open(mysql.Open(dsn), &gorm.Config{
    // 开发环境打印 SQL
    Logger: logger.Default.LogMode(logger.Info),
  })

  if err != nil {
    panic("数据库连接失败:" + err.Error())
  }

  // 设置连接池
  sqlDB, _ := db.DB()
  sqlDB.SetMaxOpenConns(10)
  sqlDB.SetMaxIdleConns(5)
  sqlDB.SetConnMaxLifetime(time.Hour)
}

func main() {
  initDB()
  fmt.Println("GORM 连接成功!")
}

四、定义模型(Model)

模型 = 表结构映射。

复制代码
package model

import (
  "gorm.io/gorm"
)

// User 对应 user 表
type User struct {
  ID        int            `gorm:"primaryKey;autoIncrement"`
  Name      string         `gorm:"size:50;not null"`
  Age       int            `gorm:"not null"`
  Email     string         `gorm:"size:100"`
  DeletedAt gorm.DeletedAt `gorm:"index"` // 软删除
}

// TableName 自定义表名
func (User) TableName() string {
  return "user"
}

五、GORM CRUD 实战(核心)

5.1 C --- Create(增加数据)

5.1.1 添加单条数据
复制代码
func createUser() {
  user := model.User{
    Name:  "张三",
    Age:   20,
    Email: "zhangsan@qq.com",
  }
  // 插入数据
  err := db.Create(&user).Error
  if err != nil {
    fmt.Println("新增失败", err)
    return
  }
  fmt.Println("新增成功,ID:", user.ID)
}
5.1.2 批量添加
复制代码
func batchCreateUser() {
  users := []model.User{
    {Name: "李四", Age: 22, Email: "lisi@qq.com"},
    {Name: "王五", Age: 25, Email: "wangwu@qq.com"},
  }
  err := db.Create(&users).Error
  if err != nil {
    fmt.Println("批量新增失败", err)
  }
}

5.2 R --- Retrieve(查询数据)

5.2.1 根据主键查询单条
复制代码
func getUserByID(id int) {
  var user model.User
  // 查询第一条记录
  err := db.First(&user, id).Error
  if err != nil {
    fmt.Println("查询失败", err)
    return
  }
  fmt.Printf("%+v\n", user)
}
5.2.2 条件查询
复制代码
// 根据名字查询
func getUserByName(name string) {
  var user model.User
  db.Where("name = ?", name).First(&user)
  fmt.Printf("%+v\n", user)
}
5.2.3 查询列表
复制代码
func getUserList() {
  var users []model.User
  // 查询所有未删除的数据
  db.Find(&users)
  fmt.Printf("%+v\n", users)
}
5.2.4 分页 + 排序
复制代码
func getUserByPage(page, pageSize int) {
  var users []model.User
  db.Order("id desc").
    Offset((page - 1) * pageSize).
    Limit(pageSize).
    Find(&users)
}

5.3 U --- Update(更新数据)

5.3.1 更新单个字段
复制代码
func updateUserAge(id, age int) {
  err := db.Model(&model.User{}).Where("id = ?", id).
    Update("age", age).Error
  if err != nil {
    fmt.Println("更新失败", err)
  }
}
5.3.2 更新多个字段
复制代码
func updateUserInfo(id int) {
  err := db.Model(&model.User{}).Where("id = ?", id).
    Updates(map[string]interface{}{
      "name":  "张三三",
      "age":   21,
      "email": "zs@qq.com",
    }).Error
  if err != nil {
    fmt.Println("更新失败", err)
  }
}

5.4 D --- Delete(删除数据)

5.4.1 软删除(推荐)
复制代码
func deleteUser(id int) {
  // 软删除:只更新 deleted_at
  err := db.Delete(&model.User{}, id).Error
  if err != nil {
    fmt.Println("删除失败", err)
  }
}
5.4.2 物理删除(真正删除)
复制代码
func hardDeleteUser(id int) {
  err := db.Unscoped().Delete(&model.User{}, id).Error
}

六、完整 main.go(可直接运行)

复制代码
package main

import (
  "你的模块名/model"
  "fmt"
  "gorm.io/driver/mysql"
  "gorm.io/gorm"
  "gorm.io/gorm/logger"
  "time"
)

var db *gorm.DB

func initDB() {
  dsn := "root:123456@tcp(127.0.0.1:3306)/testdb?charset=utf8mb4&parseTime=True&loc=Local"
  var err error
  db, err = gorm.Open(mysql.Open(dsn), &gorm.Config{
    Logger: logger.Default.LogMode(logger.Info),
  })
  if err != nil {
    panic(err)
  }
  sqlDB, _ := db.DB()
  sqlDB.SetMaxOpenConns(10)
  sqlDB.SetMaxIdleConns(5)
}

func main() {
  initDB()

  // 1. 创建
  createUser()

  // 2. 查询
  getUserByID(1)

  // 3. 更新
  updateUserAge(1, 21)

  // 4. 删除
  // deleteUser(1)
}

七、GORM CRUD 高频方法总结

方法 作用
Create() 新增单条 / 批量
First() 查询单条(主键)
Where() 条件查询
Find() 查询列表
Update() 更新单个字段
Updates() 更新多个字段
Delete() 软删除
Unscoped().Delete() 物理删除

八、避坑指南(生产必看)

  1. 查询必须处理 ErrRecordNotFound
  2. 更新必须加 Where,否则全表更新
  3. 软删除查询自动过滤已删除数据
  4. 全局 db 必须是单例
  5. 上线必须关闭 SQL 日志
  6. 必须设置连接池,防止连接过多

九、总结

本文使用 GORM V2 + MySQL 完整实现了数据库 CRUD 操作,涵盖企业开发最常用写法:

  • 连接数据库
  • 模型定义
  • 增删改查
  • 分页、排序、条件查询
  • 软删除
  • 生产规范

GORM 简单、高效、稳定,是 Go 后端开发必备技能。


版权声明

本文为原创 Go 后端技术文章,CSDN 首发,GORM CRUD 实战教程,代码可直接复制运行,禁止未经授权转载、抄袭与搬运,侵权必究!

相关推荐
网管NO.13 小时前
SQL 是什么?
数据库·sql
June`3 小时前
多线程redis项目之rdb
数据库·redis·缓存
zxrhhm3 小时前
Oracle INSERT ALL 多表多行插入语法详解
数据库·oracle
喵了几个咪3 小时前
单体项目如何“无感”演进微服务?GoWind的Core+BFF分层实践
微服务·架构·golang·gowind·bff
zzhongcy3 小时前
Flyway 数据库版本管理工具使用指南
数据库·人工智能
志栋智能3 小时前
效率革命:超自动化巡检如何将小时压缩为分钟?
运维·数据库·自动化
十年编程老舅3 小时前
Linux NUMA架构深度剖析:内存管理、进程调度与性能优化
linux·数据库·c++·内存管理·numa
fly_over4 小时前
AI Agent 开发实战教程(三):记忆与数据库集成
数据库·人工智能·python·ai agent
139的世界真奇妙4 小时前
生产问题排查记录
golang·bug·学习方法