GORM Quick Start(实践记录) | 青训营

139 阅读5分钟

📚 前言

GORM 是 Go 语言中一个强大的 ORM(Object-Relational Mapping)库,它提供了方便的方式来操作数据库,将数据库操作转化为面向对象的操作。本文将记录使用 GORM 在 Go 中连接本机的 MySQL 数据库,并实现增删改查操作。

目录结构如下:

gormdemo/
├── main.go
├── models.go
└── utils.go
  • gormdemo:项目的根目录,包含所有的源代码和配置文件。
    • main.go:主程序入口文件,包含项目的主函数。这是应用程序的启动点。
    • models.go:存放数据模型的定义和数据库操作相关的函数。
    • utils.go:存放通用的工具函数。

学习资料:GORM - The fantastic ORM library for Golang, aims to be developer friendly.


📝 实践记录

(1)创建项目

首先,选择一个目录并创建一个新的文件夹作为项目文件夹,然后在终端中进入该文件夹并执行以下命令启用 Go Modules

go mod init gormdemo

这个命令将创建一个名为 gormdemo 的 Go 模块,并在项目目录下生成一个 go.mod 文件。go.mod 文件用来记录项目的依赖关系和版本信息。

(2)安装依赖

因为需要安装 GORM 和 MySQL 驱动。因此打开终端,输入以下命令在 Go 项目中安装:

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

(3)utils

创建一个 utils.go 文件,添加以下内容:

package main

import (
	"fmt"
	"os"
)

// getDSN 获取数据库连接字符串
func getDSN() string {
	return "username:password@tcp(127.0.0.1:3306)/your_database_name?charset=utf8mb4&parseTime=True&loc=Local"
}

// checkError 检查错误并进行处理
func checkError(err error, message string) {
	if err != nil {
		fmt.Println(message, err)
		os.Exit(1)
	}
}

记录:

  • getDSN 函数用于获取数据库连接字符串(DSN,Data Source Name),在这里返回的是一个MySQL数据库的连接字符串。你需要将 "username", "password", "your_database_name" 替换为实际的用户名、密码和数据库名。其中:
    • charset=utf8mb4: 这个选项指定了数据库连接的字符编码。使用这个字符编码可以确保在存储和检索数据时支持更多的字符。
    • parseTime=True: 这个选项告诉GORM在从数据库中检索时间数据时自动解析为Go语言的时间类型。如果不设置这个选项,从数据库检索的时间数据将会是原始的数据库时间格式,而设置为 True 后,GORM会将其解析为Go的 time.Time 类型。
    • loc=Local: 这个选项用于设置时间的本地化时区。在这个例子中,Local 表示使用本地时区来处理时间。这意味着在数据库存储和检索时间数据时,会考虑本地时区的差异。
  • checkError函数用于检查是否有错误发生,如果有错误,就打印出错误信息并退出程序。

(4)models

package main

import (
	"gorm.io/gorm"
)

// User 是一个数据模型结构
type User struct {
	ID       uint   `gorm:"primaryKey"`      // 用户的唯一标识
	Username string `gorm:"column:username"` // 用户名字段
	Email    string `gorm:"column:email"`    // 电子邮件地址字段
}

// createUser 创建一个新用户记录
func createUser(db *gorm.DB, username, email string) error {
	// 创建一个新的 User 结构体实例,并初始化其中的字段
	newUser := &User{
		Username: username,
		Email:    email,
	}
	// 使用 GORM 的 Create 方法插入记录
	result := db.Create(newUser)
    // 返回可能出现的错误
	return result.Error
}

// getUserByID 根据用户 ID 查询用户记录
func getUserByID(db *gorm.DB, id uint) (*User, error) {
	var user User
    // 在数据库中查找指定 ID 的用户记录
	result := db.First(&user, id) 
	if result.Error != nil {
        // 如果出现错误,返回 nil 和错误信息
		return nil, result.Error 
	}
    // 返回找到的用户记录和 nil 错误
	return &user, nil 
}

// updateUserEmail 更新用户的电子邮件地址
func updateUserEmail(db *gorm.DB, id uint, newEmail string) error {
	user := &User{}
    // 在数据库中查找指定 ID 的用户记录
	result := db.First(user, id) 
	if result.Error != nil {
        // 如果出现错误,返回错误信息
		return result.Error 
	}
	// 使用 GORM 的 Model 和 Update 方法更新记录字段
	result = db.Model(user).Update("Email", newEmail)
    // 返回可能出现的错误
	return result.Error
}

// deleteUser 根据用户 ID 删除用户记录
func deleteUser(db *gorm.DB, id uint) error {
	var user User
    // 在数据库中查找指定 ID 的用户记录
	result := db.First(&user, id) 
	if result.Error != nil {
        // 如果出现错误,返回错误信息
		return result.Error 
	}
	// 使用 GORM 的 Delete 方法删除记录
	result = db.Delete(&user)
    // 返回可能出现的错误
	return result.Error
}

(5)main

package main

import (
	"fmt" // 输入输出标准库

	"gorm.io/driver/mysql" // MySQL数据库驱动
	"gorm.io/gorm"         // 数据库操作
)

func main() {
	// 获取数据库连接字符串
	dsn := getDSN()
	// 连接 MySQL 数据库
	db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
	checkError(err, "连接数据库失败:")
	fmt.Println("数据库连接成功...")

	// 自动创建表结构
	err = db.AutoMigrate(&User{})
	checkError(err, "AutoMigrate()函数运行发生错误:")
	fmt.Println("成功创建表")

	// 创建新用户
	err = createUser(db, "zhangsan", "111111@example.com")
	checkError(err, "无法创建用户1,发生错误:")
	fmt.Println("成功创建用户1...")

	// 创建新用户
	err = createUser(db, "wangwu", "888888@example.com")
	checkError(err, "无法创建用户2,发生错误:")
	fmt.Println("成功创建用户2...")

	// 根据ID查询用户
	user, err := getUserByID(db, 1)
	checkError(err, "无法获取用户1的数据,发生错误:")
	fmt.Println("成功查询用户1,用户名:", user.Username, "邮箱:", user.Email)

	// 更新用户邮箱
	err = updateUserEmail(db, 1, "666666@example.com")
	checkError(err, "无法更新用户1的信息,发生错误:")
	fmt.Println("成功更新用户1的信息...")

	// 删除用户
	err = deleteUser(db, 1)
	checkError(err, "无法删除用户1的信息,发生错误:")
	fmt.Println("成功删除用户1的信息...")

	// 确保在程序结束时关闭数据库连接
	sqlDB, err := db.DB()
	checkError(err, "获取数据库实例失败!")
	defer sqlDB.Close()
}

(6)运行项目

最后,在终端运行以下命令生成一个二进制文件:

go build

然后,运行该文件:

.\gormdemo.exe

它会连接到数据库,执行操作,然后输出结果。

请确保你的 MySQL 服务器已启动,并且数据库的配置信息正确。如果一切顺利,你应该会在控制台上看到连接成功的信息以及各个操作的输出。

📖 总结

在连接数据库时,GORM 使用 MySQL 驱动建立与数据库的连接,并将模型映射到数据库表。通过反射和标签,GORM 将结构体的字段映射到数据库的列,然后通过调用相应的方法实现数据库操作。

通过使用 GORM,我们可以在 Go 项目中轻松地连接本机的 MySQL 数据库,并实现增删改查操作。