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 实战教程,代码可直接复制运行,禁止未经授权转载、抄袭与搬运,侵权必究!

相关推荐
Database_Cool_13 分钟前
阿里云 Tair(企业级内存数据库)vs 腾讯云 Redis 云缓存深度对比:性能/数据结构/成本全维度 Benchmark
数据库·阿里云·缓存
流星白龙21 分钟前
【Redis】1.Redis特性
数据库·redis·缓存
奶糖 肥晨24 分钟前
DBeaver 安装与 MySQL 连接配置教程
数据库·mysql
woshihuanglaoshi42 分钟前
数据迁移与版本管理 - Flutter在鸿蒙平台实现数据库升级策略
数据库·学习·flutter·华为·harmonyos·鸿蒙·鸿蒙系统
java_logo3 小时前
Apache Doris Docker 部署指南:实时分析数据库实战
数据库·docker·apache·doris·apache doris·轩辕镜像·docker部署doris
灯澜忆梦9 小时前
GO_并发编程---定时器
开发语言·后端·golang
广州灵眸科技有限公司10 小时前
xfce桌面触摸校准:基于灵眸科技EASY-EAl-Orin-Nano
数据库·windows·科技
憧憬成为web高手13 小时前
皮卡丘靶场速通--sql 2
数据库·sql·mybatis
段一凡-华北理工大学13 小时前
向量数据库实战:选型、调优与落地~系列文章12:文本分块策略实战:chunk_size 怎么选?重叠多少?
开发语言·数据库·后端·oracle·rust·工业智能体·高炉智能化
oradh15 小时前
Oracle XTTS实现跨版本迁移和升级(Oracle 11g单库升级至19C RAC集群)
数据库·oracle·11g升级19c·xtts跨版本迁移和升级