当前位置: 首页 > article >正文

【Golang学习之旅】Go + MySQL 数据库操作详解

文章目录

    • 前言
    • 1. GORM简介
    • 2. 安装GORM并连接MySQL
      • 2.1 安装GORM和MySQL驱动
      • 2.2 连接MySQL
    • 3. GORM数据模型(Model)
      • 3.1 定义User结构体
      • 3.2 自动迁移(AutoMigrate)
    • 4. GORM CRUD 操作
      • 4.1 插入数据(Create)
      • 4.2 查询数据(Read)
      • 4.3 更新数据(Update)
      • 4.4 删除数据(Delete)
    • 5. 进阶功能:事务 & 关联关系
      • 5.1 事务操作
    • 6. GORM 性能优化
      • 6.1 添加索引
      • 6.2 批量插入
    • 🎯 总结

前言

✅ 适合人群:Go 后端开发者 | 数据库开发者 | 想掌握 GORM 的工程师
✅ 文章亮点:从 安装、基础操作、CRUD、事务、索引优化 到 进阶技巧,全面解析 GORM
✅ 目标:掌握 Go 语言 + MySQL(GORM),开发高效数据库应用!

1. GORM简介

GORM是Go语言最流行的ORM框架,它提供了一套强大且简介的数据库操作API,相比database/sql,它具备以下优势:
✅ 代码简洁:无需手写 SQL,使用链式调用
✅ 支持自动迁移:可自动创建和更新数据库表结构
✅ 支持事务、预加载、钩子函数
✅ 支持多种数据库(MySQL、PostgreSQL、SQLite、SQL Server)
✅ 支持软删除、乐观锁、索引管理

2. 安装GORM并连接MySQL

2.1 安装GORM和MySQL驱动

执行以下命令安装 GORM 和 MySQL 依赖:

go get -u gorm.io/gorm
go get -u gorm.io/driver/mysql

2.2 连接MySQL

main.go中编写数据库连接代码:

package main

import (
    "fmt"
    "gorm.io/driver/mysql"
    "gorm.io/gorm"
)
var DB *gorm.DB  // 全局数据库实例

func InitDB() {
	 dsn := "root:password@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{})
	 if err != nil {
		panic("数据库连接失败:" + err.Error())
	}
	fmt.Println("数据库连接成功!")
}

func main() {
	InitDB()
}

📌 替换 root:password 为你的 MySQL 账号密码,testdb 为数据库名称
📌 确保 MySQL 服务已开启,并且testdb数据库已存在

3. GORM数据模型(Model)

GORM的模型(Model)类似于数据库中的表,每个字段对应表的列。

3.1 定义User结构体

type User struct {
	ID uint `gorm:"primaryKey"`  // 主键
	Name string `gorm:"size:100"`  // 名字,最大100字符
	Age int  // 年龄
	Email string `gorm:"unique"`  // 邮箱,唯一约束
	CreateAt time.Time
}

3.2 自动迁移(AutoMigrate)

GORM支持自动迁移,可以自动创建表结构。

package main

import (
	"fmt"
	"time"
	
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
)

type User struct {
	ID       uint   `gorm:"primaryKey"` // 主键
	Name     string `gorm:"size:100"`   // 名字,最大100字符
	Age      int    // 年龄
	Email    string `gorm:"unique"` // 邮箱,唯一约束
	CreateAt time.Time
}

var DB *gorm.DB

func InitDB() {
    dsn := "root:password@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{})
    if err != nil {
        panic("❌ 数据库连接失败:" + err.Error())
    }
    fmt.Println("✅ 数据库连接成功!")
}

func Migrate() {
	err := DB.AutoMigrate(&User{}) // 自动迁移User表
	if err != nil {
		fmt.Println("数据库迁移失败:", err)
	}else {
		fmt.Println("数据库迁移成功!")
	}
}

func main() {
    InitDB()
    Migrate()
}

📌 运行 go run main.go,会自动创建 users 表! 🚀

4. GORM CRUD 操作

4.1 插入数据(Create)

package main

import (
	"fmt"

	"time"
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
)

type User struct {
	ID       uint   `gorm:"primaryKey"` // 主键
	Name     string `gorm:"size:100"`   // 名字,最大100字符
	Age      int    // 年龄
	Email    string `gorm:"unique"` // 邮箱,唯一约束
	CreateAt time.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{})
	if err != nil {
		panic("❌ 数据库连接失败:" + err.Error())
	}
	fmt.Println("✅ 数据库连接成功!")
}

func Migrate() {
	err := DB.AutoMigrate(&User{}) // 自动迁移User表
	if err != nil {
		fmt.Println("数据库迁移失败:", err)
	} else {
		fmt.Println("数据库迁移成功!")
	}
}

func CreateUser() {
	user := User{Name: "Zhangsan", Age: 18, Email: "ponyma@tencent.com",CreateAt: time.Now()}
	result := DB.Create(&user)
	if result.Error != nil {
		fmt.Println("数据插入失败", result.Error)
	} else {
		fmt.Println("数据插入成功:", user)
	}
}

func main() {

	InitDB()
	// Migrate()
	CreateUser()

}

在这里插入图片描述

4.2 查询数据(Read)

func GetUserByID(id int) {
	var user User
	result := DB.First(&user, id)
	if result.Error != nil {
		fmt.Println("查询失败:",result.Error)
	}else {
		fmt.Println("查询成功:",user)
	}
}

在这里插入图片描述

4.3 更新数据(Update)

func UpdateUser(id int,newAge int) {
	result :=DB.Model(&User{}).Where("id = ?",id).Update("age",newAge)
	if result.Error != nil {
		fmt.Println("数据更新失败:", result.Error)
	}else {
		fmt.Println("数据更新成功:", result.RowsAffected,"行")
	}
}

在这里插入图片描述

4.4 删除数据(Delete)

func DeleteUser(id uint) {
	result := DB.Delete(&User{}, id)
	if result.Error != nil {
		fmt.Println("❌ 删除失败:", result.Error)
	} else {
		fmt.Println("✅ 删除成功:", result.RowsAffected, "行")
	}
}

在这里插入图片描述

5. 进阶功能:事务 & 关联关系

5.1 事务操作

func TransferFunds(senderID, receiverID uint, amount int) {
    tx := DB.Begin()  // 开启事务

    defer func() {
        if r := recover(); r != nil {
            tx.Rollback()  // 事务回滚
        }
    }()

    sender := User{}
    receiver := User{}

    if err := tx.First(&sender, senderID).Error; err != nil {
        tx.Rollback()
        return
    }

    if err := tx.First(&receiver, receiverID).Error; err != nil {
        tx.Rollback()
        return
    }

    // 模拟扣款
    sender.Age -= amount
    receiver.Age += amount

    if err := tx.Save(&sender).Error; err != nil {
        tx.Rollback()
        return
    }

    if err := tx.Save(&receiver).Error; err != nil {
        tx.Rollback()
        return
    }

    tx.Commit()  // 提交事务
}

6. GORM 性能优化

6.1 添加索引

type Product struct {
    ID       uint   `gorm:"primaryKey"`
    Name     string `gorm:"index"`  // 索引
    Price    float64
}

6.2 批量插入

func BatchInsertUsers(users []User) {
    DB.Create(&users)
}

🎯 总结

✅ 学习了 GORM 基础:安装、连接 MySQL、定义 Model
✅ 掌握了 CRUD 操作:插入、查询、更新、删除
✅ 实现了事务操作,防止数据不一致
✅ 了解了索引优化 & 性能优化

🔥 现在,你已经掌握了 Go + MySQL(GORM)的完整开发流程! 🚀


http://www.kler.cn/a/542891.html

相关文章:

  • ios通过xib创建控件
  • SQL Server安装流程
  • 【Docker】
  • openAI官方prompt技巧(一)
  • 数据结构——【二叉树模版】
  • Kotlin Android 环境搭建
  • Pandas数据填充(fill)中的那些坑:避免机器学习中的数据泄露
  • react国际化配置react-i18next详解
  • 使用WebUI访问本地Deepseek(Ollama集成Open WebUI)
  • office 365 更新后打不开word问题
  • depcheck检查node.js项目中未使用和缺失依赖的工具
  • 免费在腾讯云Cloud Studio部署DeepSeek-R1大模型
  • encodeURI(),encodeURIComponent()区别
  • AF3 gdt函数解读
  • nginx安装并部署前端项目【包括Linux与Windows系统】
  • 前端性能分析常见内容
  • C语言蓝桥杯1003: [编程入门]密码破译
  • 香港中文大学 Adobe 推出 MotionCanvas:开启用户掌控的电影级图像视频创意之旅。
  • 基于Springboot(Maven项目)——分页
  • 在 debian 12 上安装 mysqlclient 报错
  • 代码随想录--977有序数组的平方
  • Java Stream 全面解析
  • 使用EVE-NG-锐捷实现三层数据通信
  • 曝苹果2026年秋季推首款折叠iPhone
  • Git 安全与权限管理
  • 深入探索现代CSS:从基础到未来趋势