使用Gorm连接数据库,并且演示CRUD操作 |豆包MarsCode 实践记录及工具使用

151 阅读5分钟

使用 GORM(Go 的 ORM 库)连接数据库并实现增删改查操作

前言

GORM 是一个功能强大且易于使用的 Go 语言 ORM 库,它支持多种数据库,如 MySQL、PostgreSQL、SQLite 等。本文将详细介绍如何使用 GORM 连接数据库,并实现基本的增删改查操作。我们将通过具体的代码示例来逐步讲解每个步骤,帮助你更好地理解和应用 GORM。

环境准备

  1. 安装 Go 语言环境

    • 确保你的系统已经安装了 Go 语言环境。你可以从 Go 官方网站 下载并安装最新版本的 Go。
    • 验证安装是否成功:
      go version
      
  2. 安装 GORM

    • 使用以下命令安装 GORM:
      go get -u gorm.io/gorm
      
  3. 安装数据库驱动

    • 本文以 MySQL 为例,安装 MySQL 驱动:
      go get -u gorm.io/driver/mysql
      

连接数据库

  1. 导入必要的包

    • 在你的 Go 文件中,首先需要导入 GORM 和 MySQL 驱动相关的包:
      import (
          "gorm.io/gorm"
          "gorm.io/driver/mysql"
      )
      
  2. 配置数据库连接信息

    • 定义数据库连接字符串(DSN),并使用 gorm.Open 方法连接数据库:
      dsn := "user: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 {
          panic("failed to connect database")
      }
      
    • 解释:
      • dsn:数据库连接字符串,格式为 user:password@tcp(host:port)/dbname?charset=utf8mb4&parseTime=True&loc=Local
      • gorm.Open:使用指定的驱动和连接字符串打开数据库连接。
      • &gorm.Config{}:GORM 的配置选项,默认配置即可。

定义模型

  1. 创建用户模型
    • 假设我们有一个用户表 users,定义对应的结构体:
      type User struct {
          ID        uint   `gorm:"primaryKey"`
          Name      string `gorm:"not null"`
          Email     string `gorm:"unique;not null"`
          CreatedAt time.Time
          UpdatedAt time.Time
      }
      
    • 解释:
      • ID:主键字段,类型为 uint
      • Name:用户名字段,不能为空。
      • Email:邮箱字段,必须唯一且不能为空。
      • CreatedAtUpdatedAt:自动维护的创建时间和更新时间字段。

数据库迁移

  1. 创建表结构
    • 使用 AutoMigrate 方法创建表结构:
      db.AutoMigrate(&User{})
      
    • 解释:
      • AutoMigrate:根据定义的模型自动创建或更新表结构。

增加数据

  1. 插入一条用户记录
    • 创建一个 User 实例,并使用 Create 方法插入数据:
      user := User{Name: "John Doe", Email: "john@example.com"}
      result := db.Create(&user)
      if result.Error != nil {
          panic("failed to create user")
      }
      
    • 解释:
      • user:创建一个 User 实例,设置用户名和邮箱。
      • db.Create:将 user 实例插入数据库。
      • result.Error:检查是否有错误发生,如果有错误则抛出异常。

查询数据

  1. 查询单条记录

    • 使用 First 方法查询第一条记录:
      var user User
      result := db.First(&user, 1) // 根据主键查询
      if result.Error != nil {
          panic("failed to find user")
      }
      fmt.Println(user)
      
    • 解释:
      • var user User:声明一个 User 类型的变量。
      • db.First:查询主键为 1 的记录,结果存储在 user 中。
      • result.Error:检查是否有错误发生,如果有错误则抛出异常。
  2. 查询多条记录

    • 使用 Find 方法查询所有记录:
      var users []User
      result := db.Find(&users)
      if result.Error != nil {
          panic("failed to find users")
      }
      fmt.Println(users)
      
    • 解释:
      • var users []User:声明一个 User 类型的切片。
      • db.Find:查询所有记录,结果存储在 users 中。
      • result.Error:检查是否有错误发生,如果有错误则抛出异常。
  3. 带条件查询

    • 使用 Where 方法进行带条件查询:
      var user User
      result := db.Where("email = ?", "john@example.com").First(&user)
      if result.Error != nil {
          panic("failed to find user")
      }
      fmt.Println(user)
      
    • 解释:
      • db.Where:设置查询条件,查询邮箱为 john@example.com 的记录。
      • db.First:查询符合条件的第一条记录,结果存储在 user 中。
      • result.Error:检查是否有错误发生,如果有错误则抛出异常。

更新数据

  1. 更新单条记录

    • 使用 ModelUpdates 方法更新记录:
      user := User{ID: 1, Name: "Jane Doe", Email: "jane@example.com"}
      result := db.Model(&user).Updates(User{Name: "Jane Doe", Email: "jane@example.com"})
      if result.Error != nil {
          panic("failed to update user")
      }
      
    • 解释:
      • user:创建一个 User 实例,设置主键、新用户名和新邮箱。
      • db.Model:指定要更新的模型实例。
      • db.Updates:更新指定的字段。
      • result.Error:检查是否有错误发生,如果有错误则抛出异常。
  2. 批量更新

    • 使用 WhereUpdate 方法进行批量更新:
      result := db.Model(&User{}).Where("id IN (?)", []int{1, 2}).Update("name", "Updated Name")
      if result.Error != nil {
          panic("failed to update users")
      }
      
    • 解释:
      • db.Model(&User{}):指定要更新的模型。
      • db.Where:设置查询条件,查询 id 为 1 和 2 的记录。
      • db.Update:更新符合条件的记录的 name 字段。
      • result.Error:检查是否有错误发生,如果有错误则抛出异常。

删除数据

  1. 删除单条记录

    • 使用 Delete 方法删除记录:
      user := User{ID: 1}
      result := db.Delete(&user)
      if result.Error != nil {
          panic("failed to delete user")
      }
      
    • 解释:
      • user:创建一个 User 实例,设置主键。
      • db.Delete:删除指定的记录。
      • result.Error:检查是否有错误发生,如果有错误则抛出异常。
  2. 批量删除

    • 使用 WhereDelete 方法进行批量删除:
      result := db.Where("id IN (?)", []int{1, 2}).Delete(&User{})
      if result.Error != nil {
          panic("failed to delete users")
      }
      
    • 解释:
      • db.Where:设置查询条件,查询 id 为 1 和 2 的记录。
      • db.Delete:删除符合条件的记录。
      • result.Error:检查是否有错误发生,如果有错误则抛出异常。

完整代码示例

package main

import (
    "fmt"
    "gorm.io/driver/mysql"
    "gorm.io/gorm"
    "time"
)

// User 模型
type User struct {
    ID        uint   `gorm:"primaryKey"`
    Name      string `gorm:"not null"`
    Email     string `gorm:"unique;not null"`
    CreatedAt time.Time
    UpdatedAt time.Time
}

func main() {
    // 数据库连接字符串
    dsn := "user: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 {
        panic("failed to connect database")
    }

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

    // 插入数据
    user := User{Name: "John Doe", Email: "john@example.com"}
    result := db.Create(&user)
    if result.Error != nil {
        panic("failed to create user")
    }

    // 查询单条记录
    var user1 User
    result = db.First(&user1, 1)
    if result.Error != nil {
        panic("failed to find user")
    }
    fmt.Println(user1)

    // 更新数据
    user1.Name = "Jane Doe"
    result = db.Model(&user1).Updates(User{Name: "Jane Doe", Email: "jane@example.com"})
    if result.Error != nil {
        panic("failed to update user")
    }

    // 删除数据
    result = db.Delete(&user1)
    if result.Error != nil {
        panic("failed to delete user")
    }
}

总结

本文详细介绍了如何使用 GORM 连接数据库,并实现了基本的增删改查操作。通过定义模型、自动迁移、插入、查询、更新和删除数据,我们可以轻松地管理数据库中的数据。GORM 的简洁和强大的功能使得它成为 Go 语言开发中处理数据库操作的理想选择。希望本文对你有所帮助,祝你在 Go 语言开发中取得更大的进步!