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

相关推荐
AOwhisky8 小时前
MySQL 学习笔记(第四期):SQL 语言之多表查询
linux·运维·网络·数据库·笔记·学习·mysql
小红卒8 小时前
mysql之udf提权
数据库·mysql·网络安全
Trouvaille ~8 小时前
【Redis篇】Redis 哨兵(Sentinel):高可用自动故障转移
数据库·redis·缓存·中间件·sentinel·高可用·哨兵
qfljg8 小时前
oracle 迁移到postgres
数据库·oracle
giaz14n9X9 小时前
Redis 分布式锁进阶第五十七篇
数据库·redis·分布式
剑神一笑9 小时前
Linux ls 命令深度解析:从目录遍历到颜色输出的实现原理
linux·服务器·数据库
Maynor9969 小时前
Codex API 网关迁移与流量优化实战
数据库·oracle
WyCAGy8ij10 小时前
Redis 分布式锁进阶第二篇讲解
数据库·redis·分布式
南极企鹅10 小时前
MySQL的两大支柱:undo Log&redo log
数据库·mysql·oracle
智航GIS10 小时前
ArcGIS大师之路500技---078文件数据库的加密与解密
数据库·arcgis