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

94 阅读4分钟

GORM 是一个非常流行的 Go 语言 ORM(对象关系映射)库,它可以方便地与数据库交互,同时支持自动迁移、查询构建器等强大功能。本文将介绍如何使用 GORM 连接数据库并实现增删改查(CRUD)操作。


环境准备

安装 GORM

首先,需要安装 GORM 和对应的数据库驱动程序(这里以 MySQL 为例)。

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

数据库准备

在开始之前,需要准备一个 MySQL 数据库,并创建一个测试表。例如,可以创建一个名为 users 的表:

CREATE DATABASE gorm_demo;
USE gorm_demo;

CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(100) NOT NULL,
    email VARCHAR(100) NOT NULL UNIQUE,
    age INT NOT NULL
);

使用 GORM 连接数据库

初始化数据库连接

在 Go 项目中,通常在 main.go 文件中初始化数据库连接。以下是一个基本的数据库连接代码:

package main

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

var DB *gorm.DB

func initDB() {
	// 数据库连接字符串: 用户名:密码@tcp(主机:端口)/数据库名?参数
	dsn := "root:password@tcp(127.0.0.1:3306)/gorm_demo?charset=utf8mb4&parseTime=True&loc=Local"

	// 初始化 GORM 数据库连接
	var err error
	DB, err = gorm.Open(mysql.Open(dsn), &gorm.Config{})
	if err != nil {
		log.Fatalf("数据库连接失败: %v", err)
	}

	log.Println("数据库连接成功!")
}

func main() {
	initDB()
}

定义模型

GORM 使用结构体与数据库表进行映射。以下是 User 模型的定义:

package main

import "gorm.io/gorm"

// 定义 User 模型
type User struct {
	ID    uint   `gorm:"primaryKey"`
	Name  string `gorm:"type:varchar(100);not null"`
	Email string `gorm:"type:varchar(100);unique;not null"`
	Age   int    `gorm:"not null"`
}

自动迁移

GORM 提供了自动迁移功能,可以根据模型自动创建或更新数据库表:

func autoMigrate() {
	err := DB.AutoMigrate(&User{})
	if err != nil {
		log.Fatalf("自动迁移失败: %v", err)
	}
	log.Println("自动迁移成功!")
}

func main() {
	initDB()
	autoMigrate()
}

实现增删改查操作

1. 创建记录(Create)

使用 DB.Create 方法可以向数据库插入一条记录:

func createUser() {
	user := User{Name: "Alice", Email: "alice@example.com", Age: 25}
	result := DB.Create(&user)

	if result.Error != nil {
		log.Fatalf("创建用户失败: %v", result.Error)
	}

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

2. 查询记录(Read)

GORM 提供了多种查询方法,以下是常见的查询操作:

根据主键查询

func getUserByID(id uint) {
	var user User
	result := DB.First(&user, id)

	if result.Error != nil {
		log.Printf("查询用户失败: %v", result.Error)
		return
	}

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

根据条件查询

func getUserByEmail(email string) {
	var user User
	result := DB.Where("email = ?", email).First(&user)

	if result.Error != nil {
		log.Printf("查询用户失败: %v", result.Error)
		return
	}

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

查询多条记录

func getAllUsers() {
	var users []User
	result := DB.Find(&users)

	if result.Error != nil {
		log.Printf("查询用户失败: %v", result.Error)
		return
	}

	log.Printf("查询到的所有用户: %+v\n", users)
}

3. 更新记录(Update)

使用 DB.SaveDB.Model 方法可以更新记录:

更新单个字段

func updateUserEmail(id uint, newEmail string) {
	result := DB.Model(&User{}).Where("id = ?", id).Update("email", newEmail)

	if result.Error != nil {
		log.Printf("更新用户失败: %v", result.Error)
		return
	}

	log.Printf("用户更新成功,影响行数: %d\n", result.RowsAffected)
}

更新多个字段

func updateUserDetails(id uint, name string, age int) {
	result := DB.Model(&User{}).Where("id = ?", id).Updates(User{Name: name, Age: age})

	if result.Error != nil {
		log.Printf("更新用户失败: %v", result.Error)
		return
	}

	log.Printf("用户信息更新成功,影响行数: %d\n", result.RowsAffected)
}

4. 删除记录(Delete)

使用 DB.Delete 方法可以删除记录:

func deleteUser(id uint) {
	result := DB.Delete(&User{}, id)

	if result.Error != nil {
		log.Printf("删除用户失败: %v", result.Error)
		return
	}

	log.Printf("用户删除成功,影响行数: %d\n", result.RowsAffected)
}

完整代码示例

以下是完整的代码实现:

package main

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

var DB *gorm.DB

// User 模型
type User struct {
	ID    uint   `gorm:"primaryKey"`
	Name  string `gorm:"type:varchar(100);not null"`
	Email string `gorm:"type:varchar(100);unique;not null"`
	Age   int    `gorm:"not null"`
}

// 初始化数据库连接
func initDB() {
	dsn := "root:password@tcp(127.0.0.1:3306)/gorm_demo?charset=utf8mb4&parseTime=True&loc=Local"
	var err error
	DB, err = gorm.Open(mysql.Open(dsn), &gorm.Config{})
	if err != nil {
		log.Fatalf("数据库连接失败: %v", err)
	}
	log.Println("数据库连接成功!")
}

// 自动迁移
func autoMigrate() {
	err := DB.AutoMigrate(&User{})
	if err != nil {
		log.Fatalf("自动迁移失败: %v", err)
	}
	log.Println("自动迁移成功!")
}

// CRUD 操作
func createUser() {
	user := User{Name: "Alice", Email: "alice@example.com", Age: 25}
	result := DB.Create(&user)

	if result.Error != nil {
		log.Fatalf("创建用户失败: %v", result.Error)
	}
	log.Printf("用户创建成功: %+v\n", user)
}

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

func updateUserEmail(id uint, newEmail string) {
	result := DB.Model(&User{}).Where("id = ?", id).Update("email", newEmail)
	if result.Error != nil {
		log.Printf("更新用户失败: %v", result.Error)
		return
	}
	log.Printf("用户更新成功,影响行数: %d\n", result.RowsAffected)
}

func deleteUser(id uint) {
	result := DB.Delete(&User{}, id)
	if result.Error != nil {
		log.Printf("删除用户失败: %v", result.Error)
		return
	}
	log.Printf("用户删除成功,影响行数: %d\n", result.RowsAffected)
}

func main() {
	initDB()
	autoMigrate()

	// 测试 CRUD 操作
	createUser()
	getUserByID(1)
	updateUserEmail(1, "newalice@example.com")
	deleteUser(1)
}

总结

通过上述步骤,我们实现了使用 GORM 连接数据库并进行增删改查操作。GORM 提供了强大的功能和灵活的 API,适合大部分的数据库操作需求。在实际项目中,还可以结合事务、预加载等功能进一步增强数据库操作能力。