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

相关推荐
2601_962066491 小时前
【Sql Server】Update中的From语句,以及常见更新操作方式
android·java·数据库
愤怒的苹果ext2 小时前
MySQL Shell备份恢复数据库
数据库·mysql·备份恢复·mysqlsh
数字新视界4 小时前
DCIM管理系统的技术架构与部署模式详解
数据库·物联网·数据中心·数据中心基础设施管理·dcim管理系统
何以解忧,唯有..4 小时前
Pydantic 介绍与使用:Python 数据校验的现代方案
数据库·python·microsoft
这个DBA有点耶5 小时前
数据库容灾进入“秒级时代”:同城双活架构原理、关键技术选型与落地实践
数据库·架构·dba
2601_962074816 小时前
大数据-264 实时数仓 - Canal MySQL的binlog研究 存储目录 变动信息 配置MySQL
大数据·数据库·mysql
2601_962073816 小时前
大数据-240 离线数仓 - 广告业务 测试 ADS层数据加载 DataX数据导出到 MySQL
大数据·数据库·mysql
Frank_refuel7 小时前
【MYSQL进阶】-> 索引理解
数据库
lv__pf7 小时前
MVCC机制【TL mysql7】
数据库
cqsztech7 小时前
Oracle ai database 26ai rac 通过gold image 更新季度补
数据库·人工智能·oracle