使用 GORM 连接数据库并实现增删改查操作 | 青训营

94 阅读3分钟

使用 GORM 连接数据库并实现增删改查操作

GORM 是 Go 语言中一个强大的 ORM(Object-Relational Mapping)库,它允许我们通过面向对象的方式来操作数据库,而不需要直接写 SQL 语句。在本文中,我们将演示如何使用 GORM 来连接数据库,并实现常见的增删改查操作。是 Go 语言中最受欢迎的 ORM(Object-Relational Mapping)库之一。它提供了一种简单而强大的方式,让开发者通过面向对象的方式与数据库进行交互,而无需直接编写 SQL 语句。GORM 极大地简化了与数据库的交互,提供了一系列方便的 API 和功能,使得开发者能够更专注于业务逻辑的实现。

使用了 GORM 连接到 MySQL 数据库,并实现了增删改查操作。GORM 为我们提供了便利的 API,使得数据库操作变得简单和高效。我们可以根据需要,根据不同的数据库表和业务逻辑,扩展更多的功能和操作。

GORM 文档:gorm.io/docs/

请注意,在实际项目中,还应该添加错误处理和日志记录等功能,以保证程序的稳定性和可靠性。

安装 GORM

 go get -u gorm.io/gorm
 go get -u gorm.io/driver/<DATABASE_DRIVER>
 go get -u gorm.io/driver/mysql

创建数据库连接

 package main
 ​
 import (
     "gorm.io/driver/mysql"
     "gorm.io/gorm"
     "log"
 )
 ​
 // 定义全局变量 db,用于存储数据库连接实例
 var db *gorm.DB
 ​
 func main() {
     // 数据库连接参数
     dsn := "user:password@tcp(127.0.0.1:3306)/database_name?charset=utf8mb4&parseTime=True&loc=Local"
 ​
     // 使用 GORM 打开数据库连接
     var err error
     db, err = gorm.Open(mysql.Open(dsn), &gorm.Config{})
     if err != nil {
         log.Fatalf("Failed to connect to database: %s", err)
     }
 ​
     // 关闭数据库连接
     defer db.Close()
 ​
     // 后续的增删改查操作都在这之后进行
 }
 ​

通过 gorm.Open 函数打开数据库连接,然后在连接字符串中指定数据库的相关信息,例如用户名、密码、数据库地址等。defer db.Close() 用于在程序结束时关闭数据库连接。

定义模型结构体

 package main
 ​
 import "time"
 ​
 // User 是用户模型
 type User struct {
     ID   uint   `gorm:"primaryKey"`
     Name string `gorm:"not null"`
     Age  int
     CreatedAt time.Time
     UpdatedAt time.Time
 }
 ​

使用了 gorm 标签来定义模型字段的属性。primaryKey 表示该字段是主键,not null 表示该字段不允许为空。

创建数据表

main 函数中通过 AutoMigrate 方法来自动创建数据表:AutoMigrate 方法会检查数据库中是否存在 User 表,如果不存在,则会创建该表。这样,我们就准备好了数据库连接和数据表,可以进行增删改查操作了。

 func main() {
     // ...(前面的数据库连接部分不再重复)
 ​
     // 自动创建数据表
     err = db.AutoMigrate(&User{})
     if err != nil {
         log.Fatalf("Failed to migrate database: %s", err)
     }
 ​
     // 后续的增删改查操作都在这之后进行
 }

实现增删改查操作

插入数据

 func createUser(user *User) error {
     result := db.Create(user)
     return result.Error
 }

查询数据

 func getUserByID(id uint) (*User, error) {
     var user User
     result := db.First(&user, id)
     return &user, result.Error
 }
 func getAllUsers() ([]User, error) {
     var users []User
     result := db.Find(&users)
     return users, result.Error
 }

更新数据

 func updateUser(user *User) error {
     result := db.Save(user)
     return result.Error
 }

删除数据

func deleteUserByID(id uint) error {
    result := db.Delete(&User{}, id)
    return result.Error
}

测试

func main() {
    // ...(前面的数据库连接和自动创建数据表部分不再重复)

    // 插入数据
    user := &User{Name: "Alice", Age: 30}
    err := createUser(user)
    if err != nil {
        log.Fatalf("Failed to create user: %s", err)
    }
    log.Printf("Created user: %v", user)

    // 查询数据
    retrievedUser, err := getUserByID(user.ID)
    if err != nil {
        log.Fatalf("Failed to get user by ID: %s", err)
    }
    log.Printf("Retrieved user: %v", retrievedUser)

    // 更新数据
    retrievedUser.Age = 31
    err = updateUser(retrievedUser)
    if err != nil {
        log.Fatalf("Failed to update user: %s", err)
    }
    log.Printf("Updated user: %v", retrievedUser)

    // 删除数据
    err = deleteUserByID(retrievedUser.ID)
    if err != nil {
        log.Fatalf("Failed to delete user: %s", err)
    }
    log.Println("User deleted successfully")

    // 后续的增删改查操作都在这之后进行
}