使用 GORM 实现数据库连接及增删改查操作| 豆包MarsCode AI刷题

138 阅读3分钟

在现代应用开发中,操作数据库是不可或缺的一部分。GORM 是 Go 语言中功能强大的 ORM(对象关系映射)库,能极大简化数据库操作。本篇文章将详细介绍如何使用 GORM 连接数据库,并实现增删改查操作。


1. 什么是 GORM?

GORM 是一个 Go 语言的 ORM 库,它提供了简洁、易用的接口,帮助开发者更方便地操作数据库。它支持主流的关系型数据库(如 MySQL、PostgreSQL、SQLite、SQL Server),并具备以下特性:

  • 自动迁移数据库表结构。
  • 支持复杂查询。
  • 提供钩子(hooks)机制,允许在特定事件发生时执行逻辑。
  • 强大的事务支持。

2. 安装 GORM

在开始使用 GORM 前,需要安装相关依赖。假设你需要连接 MySQL 数据库,可以按照以下步骤操作。

2.1 安装 GORM 和 MySQL 驱动

在你的项目目录下执行以下命令:

bash
复制代码
go get -u gorm.io/gorm
go get -u gorm.io/driver/mysql

2.2 项目结构

以下是我们项目的基本结构:

bash
复制代码
gorm-crud/
│
├── main.go         # 主程序入口
└── models/
    └── user.go     # 定义 User 模型

3. 数据库连接

首先,在 main.go 文件中初始化数据库连接。

go
复制代码
package main

import (
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
	"log"
)

var DB *gorm.DB

func InitDB() {
	// 数据库连接信息
	dsn := "username:password@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local"

	// 使用 GORM 连接数据库
	db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
	if err != nil {
		log.Fatalf("连接数据库失败: %v", err)
	}

	DB = db
	log.Println("数据库连接成功")
}

func main() {
	InitDB()
}

注意:将 usernamepassworddbname 替换为实际的数据库配置。


4. 定义模型

GORM 使用模型来表示数据库中的表。我们创建一个 User 模型,代表用户表。

models/user.go 文件中:

go
复制代码
package models

import "gorm.io/gorm"

type User struct {
	ID       uint   `gorm:"primaryKey"` // 主键
	Name     string `gorm:"size:100"`   // 名称
	Email    string `gorm:"unique"`     // 邮箱,唯一约束
	Password string // 密码
}

func Migrate(db *gorm.DB) {
	err := db.AutoMigrate(&User{})
	if err != nil {
		panic("数据库迁移失败: " + err.Error())
	}
}

4.1 自动迁移

main.go 中调用模型的 Migrate 方法:

go
复制代码
package main

import "gorm-crud/models"

func main() {
	InitDB()

	// 自动迁移
	models.Migrate(DB)
}

运行程序时,GORM 会根据 User 模型自动创建或更新数据库表结构。


5. 实现增删改查操作

5.1 创建记录(Create)

通过 DB.Create() 方法可以向数据库插入记录。

main.go 中添加如下代码:

go
复制代码
func CreateUser(name, email, password string) {
	user := models.User{Name: name, Email: email, Password: password}

	result := DB.Create(&user)
	if result.Error != nil {
		log.Printf("创建用户失败: %v\n", result.Error)
		return
	}

	log.Printf("用户创建成功,ID: %d\n", user.ID)
}

调用该方法:

go
复制代码
func main() {
	InitDB()
	models.Migrate(DB)

	CreateUser("John Doe", "john@example.com", "securepassword")
}

5.2 查询记录(Read)

可以通过主键或条件查询记录:

go
复制代码
func GetUserByID(id uint) {
	var user models.User

	result := DB.First(&user, id)
	if result.Error != nil {
		log.Printf("用户查询失败: %v\n", result.Error)
		return
	}

	log.Printf("查询到用户: %+v\n", user)
}

调用该方法:

go
复制代码
GetUserByID(1)

还可以通过条件查询:

go
复制代码
func GetUserByEmail(email string) {
	var user models.User

	result := DB.Where("email = ?", email).First(&user)
	if result.Error != nil {
		log.Printf("用户查询失败: %v\n", result.Error)
		return
	}

	log.Printf("查询到用户: %+v\n", user)
}

5.3 更新记录(Update)

可以通过 DB.Save()DB.Model().Updates() 更新记录:

go
复制代码
func UpdateUserEmail(id uint, newEmail string) {
	var user models.User

	// 查询用户
	if err := DB.First(&user, id).Error; err != nil {
		log.Printf("用户查询失败: %v\n", err)
		return
	}

	// 更新邮箱
	user.Email = newEmail
	if err := DB.Save(&user).Error; err != nil {
		log.Printf("更新用户失败: %v\n", err)
		return
	}

	log.Printf("用户更新成功: %+v\n", user)
}

调用该方法:

go
复制代码
UpdateUserEmail(1, "newemail@example.com")

5.4 删除记录(Delete)

使用 DB.Delete() 删除记录:

go
复制代码
func DeleteUser(id uint) {
	var user models.User

	// 删除用户
	if err := DB.Delete(&user, id).Error; err != nil {
		log.Printf("删除用户失败: %v\n", err)
		return
	}

	log.Printf("用户删除成功,ID: %d\n", id)
}

调用该方法:

go
复制代码
DeleteUser(1)

6. 完整代码

将上述代码整合到 main.gomodels/user.go 中,你会得到一个能够完整实现增删改查功能的项目。


7. 总结

本篇文章介绍了如何使用 GORM 连接数据库并实现基本的增删改查操作。通过 GORM,你可以轻松管理 Go 项目中的数据库交互,专注于业务逻辑开发。