GORM的基础使用 | 豆包MarsCode AI刷题

22 阅读6分钟

GORM 是 Go 语言中一个非常流行的 ORM(对象关系映射)库,它简化了与数据库交互的过程,使得开发者可以通过结构体直接操作数据库,而不需要编写复杂的 SQL 查询语句。在本篇博客中,我将介绍如何使用 GORM 连接数据库,并实现增、删、改、查操作。

1. GORM 简介

GORM 是 Go 语言中最受欢迎的 ORM 库,它支持多种数据库引擎,包括 MySQL、PostgreSQL、SQLite 等。它为 Go 提供了一个更加友好、简洁的数据库访问方式,允许开发者通过结构体和方法来执行数据库操作,从而减少了手写 SQL 的复杂度。

2. 安装 GORM

首先,我们需要安装 GORM 和相应的数据库驱动。在本例中,我们使用 MySQL 数据库作为示范。

使用以下命令来安装 GORM 和 MySQL 驱动:

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

3. 数据库连接配置

首先我们需要在数据库(库名learn_gorm,与下文代码保持一致)中准备一张表,建表语句如下

CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(255) NOT NULL,
    email VARCHAR(255) UNIQUE NOT NULL,
    password VARCHAR(255) NOT NULL
);

安装完依赖后,我们需要配置数据库连接。GORM 支持多种数据库驱动,以下示例展示如何连接到 MySQL 数据库。

package main

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

var DB *gorm.DB
var err error

// 数据库初始化
func init() {
	dsn := "root:123456@tcp(127.0.0.1:3306)/learn_gorm?charset=utf8mb4&parseTime=True&loc=Local"
	DB, err = gorm.Open(mysql.Open(dsn), &gorm.Config{})
	if err != nil {
		fmt.Println("连接失败:", err)
		panic("数据库连接失败!")
	}
	fmt.Println("数据库连接成功!")
}

在上面的代码中,我们使用 gorm.Open 来打开数据库连接。dsn(数据源名称)是数据库连接的字符串,包含了用户名、密码、数据库地址和数据库名称等信息。

数据源名称(DSN)格式

在 GORM 中,dsn 是用来配置数据库连接的字符串。它包含了数据库的各种连接信息,如用户名、密码、数据库地址、端口等。DSN 的格式通常为:

username:password@protocol(address)/dbname?param1=value1&param2=value2

解释

  • username:password:数据库的用户名和密码,通常用 : 隔开。
  • protocol:数据库连接协议,通常是 tcp,表示使用 TCP 协议连接数据库。
  • address:数据库服务器的 IP 地址和端口,格式为 host:port,例如 127.0.0.1:3306 表示连接本地的 MySQL 数据库,端口为 3306。
  • dbname:要连接的数据库名称,例如 gorm_example
  • charset:数据库字符集,通常使用 utf8mb4,这是 MySQL 推荐的字符集,支持完整的 Unicode 字符集。
  • parseTime:表示是否解析时间字段。设置为 True 时,GORM 会自动解析数据库中的时间类型字段。
  • loc:时区设置。Local 表示使用本地时区。

例如,以下是一个连接 MySQL 数据库的完整 DSN 字符串:

dsn := "root:password@tcp(127.0.0.1:3306)/gorm_example?charset=utf8mb4&parseTime=True&loc=Local"
  • root 是数据库的用户名。
  • password 是数据库的密码。
  • 127.0.0.1:3306 是数据库服务器的地址和端口。
  • gorm_example 是要连接的数据库名称。
  • charset=utf8mb4 确保支持 UTF-8 编码。
  • parseTime=True 确保 GORM 可以正确处理时间字段。
  • loc=Local 使用本地时区。

通过这个 DSN 字符串,GORM 可以连接到指定的数据库并进行操作

4. 定义数据模型

接下来,我们需要定义一个数据模型。GORM 会通过结构体来映射数据库表,每个字段对应一个表列。

type User struct {
	ID       uint   `gorm:"primaryKey"`
	Name     string
	Email    string `gorm:"unique"`
	Password string
}

在上面的代码中,我们定义了一个 User 结构体,它包含了 ID、Name、Email 和 Password 字段。GORM 会将这个结构体映射到一个名为 users 的数据库表。

结构体标签

在 Go 语言中,结构体标签(即反引号包裹的部分)用于提供额外的信息,供库或框架(如 GORM)在处理结构体时使用。具体到 GORM,结构体标签主要用于指定字段在数据库中的属性和行为。

type User struct {
	ID       uint   `gorm:"primaryKey"`  // 将 ID 字段标记为主键
	Name     string
	Email    string `gorm:"unique"`      // 将 Email 字段设置为唯一约束
	Password string
}

5. 增:插入数据

使用 GORM 插入数据非常简单。我们可以通过调用 Create 方法来插入一条新的记录。

func createUser() {
	user := User{Name: "John Doe", Email: "john@example.com", Password: "secret"}
	result := DB.Create(&user)
	if result.Error != nil {
		fmt.Println("插入失败:", result.Error)
		return
	}
	fmt.Println("用户插入成功:", user)
}

在上面的代码中,我们创建了一个新的 User 对象,并将其插入到数据库中。如果插入成功,GORM 会自动生成一个 ID,并将其返回。

6. 查:查询数据

GORM 提供了多种方式来查询数据,我们可以使用 FirstLastFind 等方法来查询记录。First 方法返回匹配条件的第一条记录。

func getUser() {
	var user User
	result := DB.First(&user, 1) // 查找 ID 为 1 的用户
	if result.Error != nil {
		fmt.Println("查询失败:", result.Error)
		return
	}
	fmt.Println("查询结果:", user)
}

在这个例子中,我们通过 First 方法查询 ID 为 1 的用户。如果用户存在,GORM 会将其信息存储在 user 变量中。

7. 改:更新数据

我们可以通过查询到的记录直接修改数据并保存。GORM 会根据结构体的字段更新数据库中的相应列。

func updateUser() {
	var user User
	result := DB.First(&user, 1)
	if result.Error != nil {
		fmt.Println("查询失败:", result.Error)
		return
	}

	// 修改用户的名字
	user.Name = "Jane Doe"
	DB.Save(&user) // 保存更新后的数据
	fmt.Println("用户信息更新成功:", user)
}

在上面的代码中,我们首先查询出 ID 为 1 的用户,然后修改其 Name 字段,并使用 Save 方法将更新保存到数据库中。

8. 删:删除数据

GORM 提供了简单的删除方法。我们可以通过 Delete 方法来删除记录。

func deleteUser() {
	var user User
	result := DB.First(&user, 1)
	if result.Error != nil {
		fmt.Println("查询失败:", result.Error)
		return
	}

	DB.Delete(&user) // 删除用户
	fmt.Println("用户已删除:", user)
}

在上面的代码中,我们查询出 ID 为 1 的用户,并使用 Delete 方法删除该记录。

9. 错误处理和事务管理

在实际开发中,我们经常需要处理数据库操作中的错误以及进行事务管理。GORM 提供了事务支持,可以确保多个数据库操作的原子性。

func transactionExample() {
	tx := DB.Begin()

	var user User
	if err := tx.First(&user, 1).Error; err != nil {
		tx.Rollback()
		fmt.Println("查询失败:", err)
		return
	}

	user.Name = "Updated Name"
	if err := tx.Save(&user).Error; err != nil {
		tx.Rollback()
		fmt.Println("更新失败:", err)
		return
	}

	tx.Commit() // 提交事务
	fmt.Println("事务提交成功")
}

在上面的代码中,我们使用 tx.Begin() 开始一个事务,并在事务中进行查询和更新操作。如果过程中发生任何错误,我们通过 tx.Rollback() 回滚事务。如果操作成功,则使用 tx.Commit() 提交事务。

10. 总结

通过本篇博客,我们学习了如何使用 GORM 库来进行数据库操作,包括增、删、改、查的常见操作。GORM 的简洁 API 使得数据库操作变得更加方便,可以大大提高开发效率。