gorm学习笔记 | 豆包MarsCode AI刷题

82 阅读4分钟

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

亲爱的coders早上中午晚上好,今天我们来学习gorm!(呱唧呱唧)谢谢大家的热情!

一、GORM 简介

GORM 是 Go 语言中一个功能强大且常用的 ORM(对象关系映射)库,它可以将数据库表映射到 Go 的结构体中,通过操作结构体来对数据库表进行增删改查操作。类似java的mybatis?功能上有相似之处吧。GORM 提供了强大的功能,包括预加载、事务支持、关联查询等,开发者效率upup。


二、环境准备

1. 安装 GORM

在 Go 项目中使用 GORM,需要安装其核心库以及数据库驱动。以 MySQL 为例,可以使用以下命令安装:

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

上述命令会安装 GORM 核心库和 MySQL 驱动,确保可以连接 MySQL 数据库。

2. 准备数据库

在 MySQL 中创建一个数据库(如 gorm_test),作为此次操作的目标数据库:

CREATE DATABASE gorm_test;

三、代码实现

1. 连接数据库

GORM 通过提供的驱动接口实现与数据库的连接。以下是一个基础的数据库连接代码:

package main

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

func main() {
    // 定义数据源名称(DSN)
    dsn := "user:password@tcp(127.0.0.1:3306)/gorm_test?charset=utf8mb4&parseTime=True&loc=Local"
    // 使用 GORM 打开数据库连接
    db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
    if err != nil {
            log.Fatalf("连接数据库失败: %v", err)
    }

    log.Println("数据库连接成功!")
}
关键点解析
  1. DSN 格式
    数据库连接字符串的格式为:

    用户名:密码@tcp(主机:端口)/数据库名?参数列表
    

    参数解释:

    • charset=utf8mb4:设置字符集,utf8mb4 支持表情符号等特殊字符。
    • parseTime=True:解析时间为 Go 的 time.Time 类型。
    • loc=Local:设置时区。
  2. gorm.Open
    gorm.Open 方法用于建立与数据库的连接,返回一个 *gorm.DB 实例。


2. 定义模型

GORM 使用结构体与数据库表进行映射。以下是一个简单的用户模型定义:

type User struct {
    ID       uint   `gorm:"primaryKey"`       // 主键
    Name     string `gorm:"size:100;not null"` // 用户名
    Email    string `gorm:"unique;not null"`  // 唯一且不能为空
    Password string `gorm:"size:255;not null"`// 密码
}
关键点解析
  • 字段标签
    标签(Tag)用来描述字段与数据库表中列的关系,例如:

    • gorm:"primaryKey" 表示该字段为主键。
    • gorm:"unique" 表示该字段需要唯一。
    • gorm:"size:100" 设置字段最大长度为 100。
  • 自动迁移
    使用 db.AutoMigrate(&User{}) 方法可以根据模型自动创建或更新数据库表结构。如果表不存在,GORM 会新建一个表;如果表结构变化,它会尝试更新表结构。

db.AutoMigrate(&User{})

3. 增删改查操作

嘿,嘿嘿,crud,我的crud,嘿嘿嘿~(查询精神状态请按1(你不会真按了吧?)

1) 创建数据
func createUser(db *gorm.DB) {
    user := User{Name: "Alice", Email: "alice@example.com", Password: "password123"}
    result := db.Create(&user)
    if result.Error != nil {
            log.Fatalf("创建用户失败: %v", result.Error)
    }
    log.Printf("创建成功, 用户ID: %d\n", user.ID)
}

解释:

  • 使用 db.Create(&user) 插入一条记录,user 是结构体实例。
  • 执行成功后,user.ID 会被自动填充为新增记录的主键值。

2) 查询数据
func queryUser(db *gorm.DB) {
    var user User
    result := db.First(&user, 1) // 根据主键查询
    if result.Error != nil {
            log.Printf("查询失败: %v", result.Error)
            return
    }
    log.Printf("查询到的用户: %+v\n", user)
}

解释:

  • db.First(&user, 1) 表示查询主键为 1 的用户记录。
  • GORM 提供了多种查询方法,如 First(查第一条)、Find(查多条)和 Where(条件查询)。

3) 更新数据
func updateUser(db *gorm.DB) {
    var user User
    db.First(&user, 1)
    user.Name = "Updated Name"
    result := db.Save(&user)
    if result.Error != nil {
            log.Printf("更新失败: %v", result.Error)
            return
    }
    log.Println("用户更新成功")
}

解释:

  • db.Save(&user) 会将整个记录保存到数据库。
  • 修改结构体字段后,再调用 Save 方法将更新同步到数据库。

4) 删除数据
func deleteUser(db *gorm.DB) {
    result := db.Delete(&User{}, 1)
    if result.Error != nil {
            log.Printf("删除失败: %v", result.Error)
            return
    }
    log.Println("用户删除成功")
}

解释:

  • db.Delete(&User{}, 1) 表示删除主键为 1 的记录。

四、完整代码

完整实现的代码如下:

package main

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

type User struct {
    ID       uint   `gorm:"primaryKey"`
    Name     string `gorm:"size:100;not null"`
    Email    string `gorm:"unique;not null"`
    Password string `gorm:"size:255;not null"`
}

func main() {
    dsn := "user:password@tcp(127.0.0.1:3306)/gorm_test?charset=utf8mb4&parseTime=True&loc=Local"
    db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
    if err != nil {
            log.Fatalf("连接数据库失败: %v", err)
    }

    db.AutoMigrate(&User{})
    createUser(db)
    queryUser(db)
    updateUser(db)
    deleteUser(db)
}

func createUser(db *gorm.DB) { /* 省略 */ }
func queryUser(db *gorm.DB) { /* 省略 */ }
func updateUser(db *gorm.DB) { /* 省略 */ }
func deleteUser(db *gorm.DB) { /* 省略 */ }

五、总结一下

  1. GORM 简化开发
    通过结构体映射表,避免了手写 SQL,提升了开发效率。

  2. 注意细节

    • 数据库连接配置需要正确填写。
    • 自动迁移在开发阶段很方便,但生产环境需谨慎使用。
  3. 实践与思考
    实践过程中需要注意性能问题,例如批量操作可以提升效率,而错误的表结构设计可能影响查询性能。

  4. 扩展方向

    • 事务操作:GORM 提供了对事务的支持,可以确保操作的原子性。
    • 关联关系:通过 GORM 可以方便地处理多表关联(如一对多、多对多)。
    • 高级查询:深入学习 GORM 提供的链式查询接口,实现复杂条件查询。

你,学废了吗?