🏷️ 标签: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() |
物理删除 |
八、避坑指南(生产必看)
- 查询必须处理
ErrRecordNotFound - 更新必须加
Where,否则全表更新 - 软删除查询自动过滤已删除数据
- 全局
db必须是单例 - 上线必须关闭 SQL 日志
- 必须设置连接池,防止连接过多
九、总结
本文使用 GORM V2 + MySQL 完整实现了数据库 CRUD 操作,涵盖企业开发最常用写法:
- 连接数据库
- 模型定义
- 增删改查
- 分页、排序、条件查询
- 软删除
- 生产规范
GORM 简单、高效、稳定,是 Go 后端开发必备技能。
版权声明
本文为原创 Go 后端技术文章,CSDN 首发,GORM CRUD 实战教程,代码可直接复制运行,禁止未经授权转载、抄袭与搬运,侵权必究!