使用 GORM 实现 Go 语言的增删改查操作| 豆包MarsCode AI刷题

80 阅读4分钟

使用 GORM 实现 Go 语言的增删改查操作

GORM 是 Go 语言中一个强大且常用的 ORM(对象关系映射)库,提供了简单的接口来操作数据库。本文将介绍如何使用 GORM 连接数据库,定义模型,并实现基本的增删改查(CRUD)操作。

一、初始化项目

在开始之前,确保你的系统上已经安装了 Go,并且已经安装 MySQL(或你希望使用的其他数据库)。接下来,我们将初始化一个 Go 项目并安装 GORM 及其数据库驱动程序。

  1. 初始化项目

    mkdir gorm_example
    cd gorm_example
    go mod init gorm_example
    
  2. 安装 GORM 和数据库驱动

    以 MySQL 为例,我们安装 GORM 和 MySQL 的驱动程序:

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

二、数据库连接

在项目的主文件 main.go 中,我们首先导入需要的包并建立数据库连接。

package main

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

// 初始化数据库连接
func InitDB() *gorm.DB {
	// 配置数据库连接参数
	dsn := "user:password@tcp(127.0.0.1:3306)/testdb?charset=utf8mb4&parseTime=True&loc=Local"
	db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
	if err != nil {
		log.Fatalf("连接数据库失败: %v", err)
	}
	fmt.Println("数据库连接成功")
	return db
}

func main() {
	db := InitDB()
	// 在这里进行其他的数据库操作
	defer db.Session(&gorm.Session{AllowGlobalUpdate: true}).Exec("DROP TABLE IF EXISTS users") // 为简化测试,退出时删除表
}

请将 userpasswordtestdb 替换为你的数据库用户名、密码和数据库名称。这里使用 gorm.io/driver/mysql 包来连接 MySQL 数据库。你也可以使用其他驱动(如 PostgreSQL、SQLite),GORM 提供了丰富的支持。

三、定义模型

接下来,我们定义一个简单的用户模型 User,它包含用户的基本信息,如 ID、名称、电子邮件和年龄。

// User 结构体代表用户模型
type User struct {
	ID    uint   `gorm:"primaryKey"`
	Name  string `gorm:"size:100;not null"`
	Email string `gorm:"size:100;uniqueIndex"`
	Age   int
}

这里的每个字段都包含 GORM 的结构标签,比如 primaryKey 用于标记主键,size 用于指定字段长度,uniqueIndex 用于创建唯一索引等。GORM 会根据结构体和标签信息自动创建表和字段。

四、自动迁移模型

GORM 提供了自动迁移(AutoMigrate)功能,用于自动创建或更新表结构。我们可以在 main 函数中调用 AutoMigrate 方法。

func main() {
	db := InitDB()
	defer db.Session(&gorm.Session{AllowGlobalUpdate: true}).Exec("DROP TABLE IF EXISTS users")

	// 自动迁移表结构
	err := db.AutoMigrate(&User{})
	if err != nil {
		log.Fatalf("自动迁移失败: %v", err)
	}
	fmt.Println("表结构自动迁移成功")

	// 调用 CRUD 操作
}

五、实现增删改查操作

5.1 创建记录

我们可以使用 Create 方法来插入新记录。

func CreateUser(db *gorm.DB, user User) {
	if err := db.Create(&user).Error; err != nil {
		log.Fatalf("创建用户失败: %v", err)
	}
	fmt.Printf("用户 %s 创建成功\n", user.Name)
}

5.2 查询记录

GORM 提供了多种查询方式,例如根据主键、条件查询、批量查询等。

func GetUserByID(db *gorm.DB, id uint) User {
	var user User
	if err := db.First(&user, id).Error; err != nil {
		log.Printf("查询用户失败: %v", err)
		return User{}
	}
	fmt.Printf("查询到用户: %v\n", user)
	return user
}

func GetAllUsers(db *gorm.DB) []User {
	var users []User
	if err := db.Find(&users).Error; err != nil {
		log.Printf("查询所有用户失败: %v", err)
		return nil
	}
	fmt.Printf("查询到所有用户: %v\n", users)
	return users
}

5.3 更新记录

更新记录可以使用 Save 方法更新整个记录,或使用 Update 方法更新特定字段。

func UpdateUserAge(db *gorm.DB, id uint, newAge int) {
	if err := db.Model(&User{}).Where("id = ?", id).Update("age", newAge).Error; err != nil {
		log.Printf("更新用户年龄失败: %v", err)
	} else {
		fmt.Printf("用户 %d 的年龄已更新为 %d\n", id, newAge)
	}
}

5.4 删除记录

使用 Delete 方法删除记录。

func DeleteUser(db *gorm.DB, id uint) {
	if err := db.Delete(&User{}, id).Error; err != nil {
		log.Printf("删除用户失败: %v", err)
	} else {
		fmt.Printf("用户 %d 已删除\n", id)
	}
}

六、测试 CRUD 操作

main 函数中调用我们实现的 CRUD 操作。

func main() {
	db := InitDB()
	defer db.Session(&gorm.Session{AllowGlobalUpdate: true}).Exec("DROP TABLE IF EXISTS users")

	err := db.AutoMigrate(&User{})
	if err != nil {
		log.Fatalf("自动迁移失败: %v", err)
	}

	// 创建用户
	CreateUser(db, User{Name: "Alice", Email: "alice@example.com", Age: 25})
	CreateUser(db, User{Name: "Bob", Email: "bob@example.com", Age: 30})

	// 查询用户
	GetUserByID(db, 1)
	GetAllUsers(db)

	// 更新用户
	UpdateUserAge(db, 1, 26)

	// 删除用户
	DeleteUser(db, 2)

	// 再次查询所有用户,查看结果
	GetAllUsers(db)
}

七、总结

本文介绍了如何使用 GORM 连接数据库,并实现增删改查操作。GORM 提供了许多有用的特性,如自动迁移、链式查询和丰富的条件操作,使得数据库操作变得非常便捷。通过 GORM,我们可以有效提高 Go 语言开发中的数据库操作效率。