📚 前言
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 数据库,并实现增删改查操作。