青训营X豆包MarsCode 技术训练营第六课 | GORM的使用

39 阅读4分钟

学习笔记:使用 GORM 连接数据库并实现增删改查操作

前言

GORM 是 Go 语言中非常流行的 ORM(Object Relational Mapping)库,它为 Go 提供了对象与数据库表之间的映射,并简化了数据库操作。GORM 以其简洁的 API 和强大的功能,成为了开发者常用的数据库访问工具。

在本文中,我将通过一个简单的示例,展示如何使用 GORM 来连接数据库并实现常见的增、删、改、查(CRUD)操作。

前提条件

  1. Go 语言安装:确保已经安装 Go 语言环境,具体安装步骤请参考 Go 官网

  2. 数据库安装:本文以 MySQL 为例,如果使用其他数据库(如 PostgreSQL、SQLite),只需更改相应的数据库驱动和连接字符串。

  3. GORM 安装:可以通过以下命令安装 GORM:

    go get -u github.com/jinzhu/gorm go get -u github.com/jinzhu/gorm/dialects/mysql

  4. 初始化项目

首先,我们需要创建一个 Go 项目并初始化 GORM。

  1. 创建项目目录:

    mkdir gorm-crud-example cd gorm-crud-example go mod init gorm-crud-example

  2. 安装 GORM 和 MySQL 驱动:

    go get -u github.com/jinzhu/gorm go get -u github.com/jinzhu/gorm/dialects/mysql

  3. 创建数据库连接

在开始使用 GORM 进行数据库操作之前,我们需要连接到数据库。

首先,创建一个文件 main.go,并在其中进行数据库连接:

package main

import ( "fmt" "github.com/jinzhu/gorm" _ "github.com/jinzhu/gorm/dialects/mysql" // 引入 MySQL 驱动 "log" )

// 定义一个结构体,映射到数据库中的表 type User struct { ID uint gorm:"primary_key" Name string gorm:"type:varchar(100);not null" Email string gorm:"type:varchar(100);unique;not null" Age int gorm:"default:0" }

var db *gorm.DB var err error

func initDB() { // 连接 MySQL 数据库 dsn := "root:password@tcp(127.0.0.1:3306)/gorm_example?charset=utf8mb4&parseTime=True&loc=Local" db, err = gorm.Open("mysql", dsn) if err != nil { log.Fatal("failed to connect to database", err) }

// 自动迁移(同步数据库结构)
db.AutoMigrate(&User{})
fmt.Println("Database connected successfully!")

}

func main() { // 初始化数据库 initDB()

// 关闭数据库连接
defer db.Close()

// 在此处进行增、删、改、查等操作

}

说明: gorm.Open("mysql", dsn):用于连接数据库,dsn 是连接字符串,其中包含数据库的用户名、密码、地址、数据库名等信息。 db.AutoMigrate(&User{}):自动迁移,将 Go 结构体映射到数据库中的表。User 结构体将映射到名为 users 的表(GORM 会自动根据结构体名称推断表名)。

  1. 增(Create)操作

创建一个新用户,并将其插入到数据库中:

func createUser() { user := User{Name: "John Doe", Email: "john@example.com", Age: 30} if err := db.Create(&user).Error; err != nil { log.Fatal("Error creating user:", err) } fmt.Println("User created successfully:", user) }

解释: db.Create(&user):将 user 对象插入到 users 表中。 user会自动生成一个 ID,并存储其他字段(如 Name, Email, Age)。

  1. 查(Read)操作

查询一个用户并打印其信息:

func getUser() { var user User if err := db.First(&user, 1).Error; err != nil { // 获取 ID 为 1 的用户 log.Fatal("Error fetching user:", err) } fmt.Println("Fetched user:", user) }

说明: db.First(&user, 1):获取 ID 为 1 的第一条记录。 db.Find(&user):查找符合条件的用户。如果没有条件,Find 会返回所有用户。

  1. 改(Update)操作

更新现有用户的信息:

func updateUser() { var user User if err := db.First(&user, 1).Error; err != nil { // 获取 ID 为 1 的用户 log.Fatal("Error fetching user:", err) }

user.Age = 35
if err := db.Save(&user).Error; err != nil {
	log.Fatal("Error updating user:", err)
}
fmt.Println("Updated user:", user)

}

说明: db.Save(&user):保存对 user 对象的修改。Save` 方法会检查主键是否存在,如果存在就执行更新操作,否则执行插入操作。

  1. 删(Delete)操作

删除用户:

func deleteUser() { var user User if err := db.First(&user, 1).Error; err != nil { // 获取 ID 为 1 的用户 log.Fatal("Error fetching user:", err) }

if err := db.Delete(&user).Error; err != nil {
	log.Fatal("Error deleting user:", err)
}
fmt.Println("Deleted user:", user)

}

说明: db.Delete(&user):删除指定的 user`。

  1. 完整示例

package main

import ( "fmt" "github.com/jinzhu/gorm" _ "github.com/jinzhu/gorm/dialects/mysql" "log" )

type User struct { ID uint gorm:"primary_key" Name string gorm:"type:varchar(100);not null" Email string gorm:"type:varchar(100);unique;not null" Age int gorm:"default:0" }

var db *gorm.DB var err error

func initDB() { dsn := "root:password@tcp(127.0.0.1:3306)/gorm_example?charset=utf8mb4&parseTime=True&loc=Local" db, err = gorm.Open("mysql", dsn) if err != nil { log.Fatal("failed to connect to database", err) }

db.AutoMigrate(&User{})
fmt.Println("Database connected successfully!")

}

func createUser() { user := User{Name: "John Doe", Email: "john@example.com", Age: 30} if err := db.Create(&user).Error; err != nil { log.Fatal("Error creating user:", err) } fmt.Println("User created successfully:", user) }

func getUser() { var user User if err := db.First(&user, 1).Error; err != nil { log.Fatal("Error fetching user:", err) } fmt.Println("Fetched user:", user) }

func updateUser() { var user User if err := db.First(&user, 1).Error; err != nil { log.Fatal("Error fetching user:", err) } user.Age = 35 if err := db.Save(&user).Error; err != nil { log.Fatal("Error updating user:", err) } fmt.Println("Updated user:", user) }

func deleteUser() { var user User if err := db.First(&user, 1).Error; err != nil { log.Fatal("Error fetching user:", err) } if err := db.Delete(&user).Error; err != nil { log.Fatal("Error deleting user:", err) } fmt.Println("Deleted user:", user) }

func main() { initDB() defer db.Close()

// 增
createUser()

// 查
getUser()

// 改
updateUser()

// 删
deleteUser()

}

总结

通过以上步骤,我们学习了如何使用 GORM 连接数据库并实现基本的增、删、改、查操作。GORM 的简洁 API 可以大大提高我们开发数据库应用的效率。对于复杂的查询和关系操作,GORM 也提供了强大的功能,例如关联查询、预加载、事务处理等,可以帮助我们应对更复杂的数据库操作。

在实际项目中,我们可以根据业务需求灵活使用 GORM,实现高效、优雅的数据操作。