GORM使用实践记录 | 豆包MarsCode AI刷题

82 阅读4分钟

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

GORM 是 Go 语言中广泛使用的对象关系映射(ORM)库,它以简洁和强大的功能著称,可以帮助开发者高效管理数据库操作。本文将详细介绍如何使用 GORM 连接数据库并实现常见的增删改查(CRUD)操作。


一、GORM 简介

GORM 是一个基于 Go 的 ORM 库,支持多种数据库(如 MySQL、PostgreSQL、SQLite、SQL Server 等),具备以下特点:

  1. 简单易用:通过对象操作数据库,无需直接编写 SQL。
  2. 丰富功能:支持链式查询、事务、迁移等功能。
  3. 强大扩展性:支持插件和自定义功能。

在本篇笔记中,我们以 MySQL 为例,演示如何使用 GORM。


二、准备工作

1. 安装 GORM 和数据库驱动

首先,需要安装 GORM 和 MySQL 的驱动程序。执行以下命令:

bash
复制代码
go get -u gorm.io/gorm
go get -u gorm.io/driver/mysql
2. 准备数据库

假设我们有一个名为 test_db 的 MySQL 数据库,并创建一个表 users,其结构如下:

  • id:用户 ID,主键,自增;
  • name:用户名,字符串;
  • email:邮箱,字符串;
  • age:年龄,整数。

创建表的 SQL 语句:

sql
复制代码
CREATE DATABASE test_db;

USE test_db;

CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(100),
    email VARCHAR(100),
    age INT
);

三、初始化 GORM 连接

GORM 提供了简单的数据库连接配置方式。以下是完整代码示例:

go
复制代码
package main

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

func main() {
    dsn := "username:password@tcp(127.0.0.1:3306)/test_db?charset=utf8mb4&parseTime=True&loc=Local"
    db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
    if err != nil {
        log.Fatalf("Failed to connect to database: %v", err)
    }

    log.Println("Database connected successfully!")
}
说明
  1. dsn 是数据源名称,格式为 用户名:密码@tcp(主机:端口)/数据库?参数
  2. gorm.Open 打开数据库连接。
  3. 使用 log.Fatalf 输出错误信息。

四、定义数据模型

GORM 中,每个数据表对应一个结构体模型,字段和表中的列一一对应。定义 User 模型如下:

go
复制代码
type User struct {
    ID    uint   `gorm:"primaryKey"`
    Name  string `gorm:"size:100"`
    Email string `gorm:"size:100"`
    Age   int
}
字段标签
  • gorm:"primaryKey":指定主键。
  • gorm:"size:100":限制字符串长度为 100。
自动迁移

GORM 提供自动迁移功能,可以根据模型自动创建或更新表结构:

go
复制代码
err := db.AutoMigrate(&User{})
if err != nil {
    log.Fatalf("Failed to migrate database: %v", err)
}

五、实现增删改查操作

1. 创建记录

创建新记录非常简单,只需实例化模型并调用 db.Create

go
复制代码
user := User{Name: "Alice", Email: "alice@example.com", Age: 25}
result := db.Create(&user)
if result.Error != nil {
    log.Fatalf("Failed to create user: %v", result.Error)
}
log.Printf("User created successfully: %v", user)
2. 查询记录

GORM 支持多种查询方式,以下是几个常见示例:

(1) 根据主键查询:

go
复制代码
var user User
result := db.First(&user, 1) // 查询 ID 为 1 的用户
if result.Error != nil {
    log.Printf("User not found: %v", result.Error)
} else {
    log.Printf("User found: %v", user)
}

(2) 条件查询:

go
复制代码
var users []User
db.Where("age > ?", 20).Find(&users) // 查询年龄大于 20 的用户
log.Printf("Users found: %v", users)
3. 更新记录

更新记录可以使用 Save 或 Updates 方法:

(1) 更新单个字段:

go
复制代码
db.Model(&user).Update("Age", 30)
log.Printf("User updated: %v", user)

(2) 更新多个字段:

go
复制代码
db.Model(&user).Updates(User{Name: "Bob", Age: 35})
log.Printf("User updated: %v", user)
4. 删除记录

删除记录通过 Delete 方法实现:

go
复制代码
db.Delete(&user)
log.Println("User deleted successfully")

六、错误处理与事务支持

1. 错误处理

每个数据库操作的返回值都包含一个 Error 字段,可以用来检查操作是否成功。例如:

go
复制代码
if result.Error != nil {
    log.Fatalf("Operation failed: %v", result.Error)
}
2. 事务支持

GORM 提供事务支持,以下是一个示例:

go
复制代码
err := db.Transaction(func(tx *gorm.DB) error {
    if err := tx.Create(&User{Name: "Tom", Age: 40}).Error; err != nil {
        return err
    }
    if err := tx.Create(&User{Name: "Jerry", Age: 35}).Error; err != nil {
        return err
    }
    return nil
})
if err != nil {
    log.Printf("Transaction failed: %v", err)
} else {
    log.Println("Transaction committed successfully")
}

七、总结

通过 GORM,我们可以轻松实现对数据库的操作,不需要编写复杂的 SQL。其简洁的 API 和强大的功能使得 Go 开发者能够专注于业务逻辑,而非数据库细节。

在本文中,我们介绍了以下内容:

  1. 安装 GORM 和数据库驱动。
  2. 初始化数据库连接。
  3. 定义数据模型并使用自动迁移。
  4. 实现增删改查操作。
  5. 错误处理与事务支持。

GORM 是开发 Go 应用程序的利器,学习和掌握它将极大提高开发效率!