基于 GORM 的 Go 语言数据库操作实践:增删改查 | 青训营

66 阅读3分钟

引言

在现代应用开发中,与数据库交互是必不可少的一部分。为了简化数据库操作,提高开发效率,Go 语言提供了丰富的 ORM(Object-Relational Mapping)库,其中 GORM 是其中的佼佼者。本文将结合 MySQL 数据库,通过 GORM 库实现增删改查操作,旨在为读者展示如何优雅地使用 GORM 进行数据库交互。

连接数据库

首先,我们需要安装 GORM 和 MySQL 驱动。通过以下命令获取所需依赖:

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

接下来,我们创建一个基本的数据库连接,并初始化 GORM。在你的 Go 代码中添加以下内容:

goCopy code
package main

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

func main() {
    // 连接数据库
    dsn := "user:password@tcp(127.0.0.1:3306)/database_name?charset=utf8mb4&parseTime=True&loc=Local"
    db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
    if err != nil {
        log.Fatal(err)
    }
    defer db.Close()
    
    // 执行增删改查操作
    // ...
}

创建数据模型

在进行数据库操作之前,我们需要定义数据模型。我们以一个简单的 User 结构为例:

goCopy code
type User struct {
    ID   uint   `gorm:"primaryKey"`
    Name string `gorm:"not null"`
    Age  int
}

增删改查操作示例

接下来,我们将通过示例代码演示 GORM 的增删改查操作。

  1. 增加数据
goCopy code
func CreateUser(db *gorm.DB, user *User) {
    result := db.Create(user)
    if result.Error != nil {
        log.Println("Error creating user:", result.Error)
    } else {
        log.Println("User created successfully")
    }
}
  1. 查询数据
goCopy code
func FindUser(db *gorm.DB, id uint) *User {
    var user User
    result := db.First(&user, id)
    if result.Error != nil {
        log.Println("Error finding user:", result.Error)
        return nil
    }
    return &user
}
  1. 更新数据
goCopy code
func UpdateUser(db *gorm.DB, user *User) {
    result := db.Save(user)
    if result.Error != nil {
        log.Println("Error updating user:", result.Error)
    } else {
        log.Println("User updated successfully")
    }
}
  1. 删除数据
goCopy code
func DeleteUser(db *gorm.DB, id uint) {
    result := db.Delete(&User{}, id)
    if result.Error != nil {
        log.Println("Error deleting user:", result.Error)
    } else {
        log.Println("User deleted successfully")
    }
}

当使用 GORM 进行数据查询操作时,可以通过一系列方法来构建查询条件和执行查询操作。下面将介绍几个常用的 GORM 查询方法、它们的参数以及用途。

1. Find 方法

func (db *DB) Find(dest interface{}, conds ...interface{}) *DB
  • 参数说明:

    • dest interface{}:查询结果将被填充到这个目标对象中,通常是一个切片。
    • conds ...interface{}:可选的查询条件,可以是多个条件。
  • 用途:查询满足条件的多条数据。

示例用法

var users []User
db.Find(&users, "age > ?", 20)

2. First 方法

func (db *DB) First(dest interface{}, conds ...interface{}) *DB
  • 参数说明:

    • dest interface{}:查询结果将被填充到这个目标对象中,通常是一个结构体。
    • conds ...interface{}:可选的查询条件,可以是多个条件。
  • 用途:查询满足条件的第一条数据。

示例用法

var user User
db.First(&user, "name = ?", "Alice")

3. Where 方法

func (db *DB) Where(conds ...interface{}) *DB
  • 参数说明:

    • conds ...interface{}:多个查询条件。
  • 用途:指定查询条件,对之后的查询操作生效。

示例用法

db.Where("age > ?", 25).Find(&users)

4. Order 方法

func (db *DB) Order(value interface{}, reorder ...bool) *DB
  • 参数说明:

    • value interface{}:排序条件。
    • reorder ...bool:是否重新应用之前的排序。
  • 用途:指定查询结果的排序方式。

示例用法

db.Order("age desc").Find(&users)

5. Limit 方法

func (db *DB) Limit(limit int) *DB
  • 参数说明:

    • limit int:限制查询结果的数量。
  • 用途:限制查询结果的数量。

示例用法

db.Limit(10).Find(&users)

6. Select 方法

func (db *DB) Select(query interface{}, args ...interface{}) *DB
  • 参数说明:

    • query interface{}:选择要查询的字段。
    • args ...interface{}:查询字段的参数。
  • 用途:指定要查询的字段。

示例用法

db.Select("name, age").Find(&users)

7. Joins 方法

func (db *DB) Joins(query string, args ...interface{}) *DB
  • 参数说明:

    • query string:关联查询条件。
    • args ...interface{}:关联查询的参数。
  • 用途:进行关联查询,例如连接其他表进行联合查询。

示例用法

db.Joins("JOIN profiles ON users.id = profiles.user_id").Find(&users)

以上介绍的方法只是 GORM 中的一部分,GORM 还提供了更多强大的查询方法和选项,用于应对各种查询需求。根据你的实际需求,选择合适的方法和参数来构建复杂的查询操作。【主要是懒不想写了】

结果与总结

上述只是简单的说明各个api的用法,只是大致对这些了解一下,用来真正写肯定还是不够的