GORM实践 | 豆包MarsCode AI刷题

25 阅读3分钟

简介

GORM 是一个使用 Go 语言编写的优秀 ORM(对象关系映射)库,它提供了一种简洁的方式来处理数据库操作,使得开发者可以用 Go 的方式来操作数据库,而不是直接编写 SQL 语句。GORM 支持多种数据库,包括 MySQL、PostgreSQL、SQLite 和 SQL Server。本文将详细介绍如何使用 GORM 连接数据库,并实现基本的增删改查(CRUD)操作。

环境准备

安装 GORM 和数据库驱动:

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

连接数据库

首先,我们需要创建一个数据库连接。以下是使用 GORM 连接 MySQL 数据库的代码:

package main

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

var db *gorm.DB

func init() {
    var err error
    // 替换为你的数据库配置
    dsn := "username:password@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local"
    db, err = gorm.Open(mysql.Open(dsn), &gorm.Config{})
    if err != nil {
        log.Fatal("Failed to connect to database: ", err)
    }
}
  • gorm.Open(dsn, config): 连接数据库并返回一个 *gorm.DB 实例。dsn 是数据源名称,包含了连接数据库所需的信息,config 是一个 *gorm.Config 实例,用于配置 GORM 的行为。

定义模型

在进行 CRUD 操作之前,我们需要定义一个模型(Model),这个模型将映射到数据库中的一个表。以下是一个简单的用户模型:

type User struct {
    gorm.Model
    Name  string
    Email string `gorm:"type:varchar(100);uniqueIndex"`
}
  • gorm.Model: 一个内嵌的结构体,包含了模型的基本字段,如 IDCreatedAtUpdatedAtDeletedAt 等。

自动迁移

GORM 提供了自动迁移(AutoMigrate)功能,可以自动创建或修改数据库表结构以匹配模型的定义:

func main() {
    initDB()
    // 自动迁移
    db.AutoMigrate(&User{})
}


-   `db.AutoMigrate(dst)`: 自动迁移方法,用于创建或修改数据库表结构以匹配模型的定义。`dst` 是要迁移的模型实例。

## 增删改查操作

### 创建(Create)

使用 `Create` 方法添加新记录:

```go
func CreateUser(name, email string) {
    user := User{Name: name, Email: email}
    result := db.Create(&user) // 使用 &user 传递指针
    if result.Error != nil {
        log.Fatal(result.Error)
    }
}

读取(Read)

使用 FindFirst 方法查询记录:

func GetUser(id uint) *User {
    var user User
    result := db.First(&user, id) // 根据 ID 查询
    if result.Error != nil {
        log.Fatal(result.Error)
    }
    return &user
}

更新(Update)

使用 SaveUpdate 方法更新记录:

func UpdateUser(id uint, name, email string) {
    result := db.Model(&User{}).Where("id = ?", id).Updates(map[string]interface{}{"name": name, "email": email})
    if result.Error != nil {
        log.Fatal(result.Error)
    }
}

删除(Delete)

使用 Delete 方法删除记录:

func DeleteUser(id uint) {
    result := db.Delete(&User{}, id)
    if result.Error != nil {
        log.Fatal(result.Error)
    }
}
  • db.Create(value): 创建记录,value 是要创建的模型实例。
  • db.Find(dest, conds): 查询多条记录,dest 是存储查询结果的切片,conds 是查询条件。
  • db.First(dest, conds): 查询单条记录,dest 是存储查询结果的变量,conds 是查询条件。
  • db.Take(dest, conds): 查询单条记录,类似于 First,但是如果没有找到记录,Take 会返回 record not found 错误。
  • db.Last(dest, conds): 查询最后一条符合条件的记录。
  • db.Update(column, value, conds): 更新记录,column 是要更新的字段,value 是更新的值,conds 是更新条件。
  • db.Updates(values, conds): 更新记录,values 是一个包含多个字段和值的映射,conds 是更新条件。
  • db.Delete(valueOrSlice, conds): 删除记录,valueOrSlice 是要删除的模型实例或切片,conds 是删除条件。

高级查询

GORM 还支持更复杂的查询,如预加载(Preload)、事务(Transaction)、原生 SQL 查询等。

预加载(Preload)

go
func GetUserWithPosts(id uint) *User {
    var user User
    db.Preload("Posts").First(&user, id)
    return &user
}

事务(Transaction)

go
func TransactionExample() {
    tx := db.Begin()
    if tx.Error != nil {
        log.Fatal(tx.Error)
    }

    // 创建用户
    if tx.Create(&User{Name: "John Doe"}).Error != nil {
        tx.Rollback()
        return
    }

    // 创建帖子
    if tx.Create(&Post{Title: "Hello World"}).Error != nil {
        tx.Rollback()
        return
    }

    tx.Commit()
}
  • db.Begin(): 开启一个新的事务。
  • tx.Commit(): 提交事务。
  • tx.Rollback(): 回滚事务。

原生 SQL 查询

go复制
func RawSQLQuery() {
    var users []User
    db.Raw("SELECT * FROM users").Scan(&users)
}
  • db.Raw(sql, args...): 执行原生 SQL 查询,sql 是 SQL 语句,args 是查询参数。
  • db.Exec(sql, args...): 执行原生 SQL 语句。

总结

本文介绍了如何使用 GORM 连接数据库,并实现了基本的 CRUD 操作。GORM 提供了丰富的功能和灵活的接口,使得数据库操作变得更加简单和高效。通过定义模型和使用 GORM 的方法,你可以轻松地与数据库进行交互。