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

相关推荐
geovindu13 分钟前
sql: JSON and XML Data Handling in SQL using mysql 9.0
数据库·sql·mysql·数据库开发
hackchen32 分钟前
LangChain 学习第 3 课 - 输出解析器(Output Parser)
数据库·学习·langchain
Mortalbreeze32 分钟前
MySQL 基础篇(九):从 B+ 树到索引优化,全面理解 MySQL 索引
数据库·mysql
泡海椒39 分钟前
JQuick-SQL SELECT 投影:字段、别名与表达式查询
数据库·sql
猫咪很可爱44 分钟前
mysqldump 失败常见场景
数据库·sql·mysql
大明二代1 小时前
从零构建 Mastra RAG MVP:DeepSeek、SiliconFlow 与 PostgreSQL/pgvector 实战
javascript·数据库·人工智能
LMT流氓兔1 小时前
第四单元——第17课:让回答边生成、边显示
服务器·数据库·人工智能·python·oracle·langchain
1024奇点1 小时前
【仓颉语言入门 · 第二篇 第 8 课】
开发语言·数据库·ide·mysql·开源
其实防守也摸鱼1 小时前
Linux文本处理命令理论学习
linux·服务器·前端·数据库·sql·学习·安全
l1t2 小时前
DuckDB 各版本 tpch 10 查询时间对比
数据库