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

193 阅读5分钟

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

GORM 是 Go 语言中的一个功能强大的 ORM(对象关系映射)库,它封装了底层数据库操作,为开发者提供了简单、高效的方式与数据库交互。通过 GORM,我们可以避免手写大量的 SQL 语句,而是通过操作结构体完成对数据表的增删改查。

本文将通过一个完整的过程,详细介绍如何使用 GORM 建立数据库连接、定义数据模型、执行自动迁移以及实现基本的 CRUD(Create、Read、Update、Delete)操作。


一、准备工作

在正式开始前,需要完成以下准备工作:

1. 安装 GORM 和数据库驱动

在 Go 项目中使用 GORM,需要安装 GORM 及其支持的数据库驱动程序。我们以 SQLite 为例,安装命令如下:

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

如果您使用的是其他数据库,如 MySQL、PostgreSQL 或 SQL Server,则需要安装相应的驱动:

  • MySQL 驱动: gorm.io/driver/mysql
  • PostgreSQL 驱动: gorm.io/driver/postgres
  • SQL Server 驱动: gorm.io/driver/sqlserver

2. 配置项目结构

创建一个新的项目目录,例如 gorm_demo,并在其中创建一个主文件 main.go,后续的代码将写在该文件中。


二、连接数据库

连接数据库是任何数据库操作的起点。在 GORM 中,连接数据库非常简单,我们只需要调用 gorm.Open 方法并传入对应的驱动和数据源名称(DSN)。

1. 连接 SQLite 数据库

以下是连接 SQLite 数据库的代码示例:

package main

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

func main() {
	// 打开 SQLite 数据库,文件名为 test.db
	db, err := gorm.Open(sqlite.Open("test.db"), &gorm.Config{})
	if err != nil {
		log.Fatalf("连接数据库失败: %v", err)
	}

	log.Println("成功连接数据库!")
}

2. 数据源名称(DSN)介绍

数据源名称(Data Source Name, DSN)是数据库连接字符串,用于提供连接数据库所需的配置信息。

SQLite 的 DSN

SQLite 的 DSN 很简单,直接传入文件名即可,例如 sqlite.Open("test.db") 表示使用当前目录下的 test.db 文件作为数据库。

MySQL 的 DSN 示例

如果使用 MySQL,数据源名称格式如下:

"username:password@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local"

3. 错误检查

数据库连接可能会失败,因此需要检查 gorm.Open 返回的错误对象。如果连接失败,程序应当终止运行,并提示错误原因。


三、定义数据模型

在 GORM 中,模型 是用结构体表示数据库表结构的核心概念。模型的每个字段映射到数据库表的某一列,字段的类型和标签定义了列的类型和约束。

示例:定义用户模型

假设我们需要一个存储用户信息的表,包含以下字段:

  • 用户 ID(主键,自增)
  • 用户名
  • 邮箱(唯一)
  • 密码

用 GORM 定义该模型如下:

type User struct {
	ID       uint   `gorm:"primaryKey"` // 主键字段,自动递增
	Name     string `gorm:"size:100"`   // 限制用户名长度为 100
	Email    string `gorm:"unique"`     // 邮箱字段唯一
	Password string // 密码字段
}

模型标签说明

  • gorm:"primaryKey" 表示该字段是主键。
  • gorm:"size:100" 指定字符串的最大长度。
  • gorm:"unique" 设置该字段唯一约束。

在定义模型时,我们可以根据需求添加更多的约束或默认值。


四、自动迁移

1. 什么是自动迁移?

自动迁移是 GORM 的一项重要功能,它会根据模型自动创建或更新数据库表。例如,如果数据库中不存在表 users,它会自动创建;如果表已存在但字段结构不同,则会更新表结构。

2. 实现代码

在连接数据库后,我们可以调用 AutoMigrate 方法完成自动迁移:

err = db.AutoMigrate(&User{})
if err != nil {
	log.Fatalf("自动迁移失败: %v", err)
}
log.Println("数据库迁移成功!")

通过以上代码,GORM 会在数据库中创建一个名为 users 的表,其中包含 IDNameEmailPassword 四个字段。


五、增删改查操作

1. 插入数据

要插入一条记录,我们可以创建一个模型实例,并调用 Create 方法:

user := User{Name: "Alice", Email: "alice@example.com", Password: "securepassword"}
result := db.Create(&user)
if result.Error != nil {
	log.Fatalf("插入数据失败: %v", result.Error)
}
log.Printf("插入成功,用户 ID 为: %d", user.ID)

2. 查询数据

查询单条记录

我们可以通过主键查询,也可以通过其他字段查询:

var user User
db.First(&user, 1) // 按主键查询
db.Where("name = ?", "Alice").First(&user) // 按条件查询
查询多条记录

如果需要查询所有用户,可以使用 Find 方法:

var users []User
db.Find(&users)

3. 更新数据

更新记录可以通过 UpdateUpdates 方法完成:

db.Model(&user).Update("Name", "UpdatedName") // 更新单个字段
db.Model(&user).Updates(User{Name: "NewName", Email: "newemail@example.com"}) // 更新多个字段

4. 删除数据

要删除一条记录,可以使用 Delete 方法:

db.Delete(&user)

六、完整示例代码

以下是一个完整的示例,涵盖了数据库连接、表迁移以及增删改查操作:

package main

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

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

func main() {
	// 连接数据库
	db, err := gorm.Open(sqlite.Open("test.db"), &gorm.Config{})
	if err != nil {
		log.Fatalf("连接数据库失败: %v", err)
	}

	// 自动迁移
	err = db.AutoMigrate(&User{})
	if err != nil {
		log.Fatalf("自动迁移失败: %v", err)
	}

	// 插入数据
	user := User{Name: "Alice", Email: "alice@example.com", Password: "securepassword"}
	db.Create(&user)

	// 查询数据
	var retrievedUser User
	db.First(&retrievedUser, user.ID)
	log.Printf("查询到用户: %+v", retrievedUser)

	// 更新数据
	db.Model(&retrievedUser).Update("Name", "UpdatedName")
	log.Printf("更新后用户: %+v", retrievedUser)

	// 删除数据
	db.Delete(&retrievedUser)
	log.Println("用户已删除")
}

七、总结

通过本文,我们从零开始实现了使用 GORM 连接数据库、定义数据模型以及实现增删改查操作的过程。GORM 提供了丰富的功能,例如事务支持、复杂查询、模型关联等,可以满足多种业务需求。