使用 GORM连接数据库实现增删改查操作(上) | 豆包MarsCode AI刷题

47 阅读5分钟

GORM 介绍与作用,以及基础知识

1.1 GORM 简介

GORM 是一个用于 Go 语言的开源 ORM(Object-Relational Mapping)库,致力于简化与数据库的交互。ORM 允许开发者通过面向对象的方式来与关系型数据库进行操作,避免了直接编写 SQL 语句,同时提高了开发效率和代码的可维护性。通过 GORM,Go 程序员能够轻松处理数据库操作,如增、删、改、查等,而无需深入了解底层的 SQL 语法。

GORM 提供了强大的功能和灵活性,支持多种关系型数据库,如 MySQL、PostgreSQL、SQLite 和 SQL Server,并且它提供了完整的链式查询接口,能够实现复杂的 SQL 查询。同时,GORM 也支持数据库自动迁移和模型关联,使得数据库结构与 Go 代码的映射更加简洁和高效。

1.2 GORM 的核心功能与特点

GORM 库为 Go 提供了许多高效的功能,以下是其核心特点:

1.2.1 自动迁移(Auto Migration)

自动迁移是 GORM 中最为强大的功能之一。使用 AutoMigrate() 方法,GORM 可以根据 Go 结构体的变化自动更新数据库表。例如,如果你对结构体添加或删除了字段,GORM 会自动执行相应的数据库操作,以使数据库结构与 Go 代码保持一致。

// 自动迁移 User 结构体
db.AutoMigrate(&User{})
1.2.2 一对一、一对多、多对多关系

GORM 支持通过结构体来建立表之间的关系,如一对一、一对多、多对多关系。例如,我们可以通过结构体嵌套来表示这些关系。

type Author struct {
	ID      uint
	Name    string
	Profile Profile
}

type Profile struct {
	ID     uint
	Age    uint
	Author Author
}

在这里,AuthorProfile 之间是“一对一”关系,GORM 会根据这个结构自动生成外键来管理表之间的关系。

1.2.3 事务(Transaction)

GORM 提供了对数据库事务的支持。事务保证了多个数据库操作的原子性。如果事务中的某个操作失败,GORM 会自动回滚所有操作,确保数据的一致性。

// 开始事务
tx := db.Begin()

// 事务中的操作
if err := tx.Create(&user).Error; err != nil {
	tx.Rollback() // 回滚事务
	return err
}

tx.Commit() // 提交事务
1.2.4 链式查询(Chained Queries)

GORM 提供了非常方便的链式查询接口,可以用来实现复杂的查询。GORM 的查询方法支持链式调用,查询条件可以灵活组合。

// 查询年龄大于 30 且名字包含 "John" 的用户
db.Where("age > ?", 30).Where("name LIKE ?", "%John%").Find(&users)
1.2.5 原生 SQL 查询

尽管 GORM 提供了丰富的查询接口,但当开发者需要使用特定的 SQL 查询时,GORM 也支持原生 SQL 查询功能。

// 执行原生 SQL 查询
db.Raw("SELECT * FROM users WHERE age > ?", 30).Scan(&users)

1.3 GORM 基本安装与配置

要在 Go 项目中使用 GORM,首先需要安装 GORM 库和相应的数据库驱动(如 MySQL 驱动)。使用 go get 命令安装 GORM 和数据库驱动。

  1. 安装 GORM:
go get -u gorm.io/gorm
  1. 安装 MySQL 驱动(以 MySQL 为例):
go get -u gorm.io/driver/mysql

1.4 使用 GORM 的基本步骤

1.4.1 连接数据库

GORM 支持多种数据库系统,通过 gorm.Open() 方法可以连接到支持的数据库。以 MySQL 为例,连接字符串通常包括数据库的用户名、密码、主机、端口和数据库名称。

package main

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

func main() {
	dsn := "root:password@tcp(127.0.0.1:3306)/testdb?charset=utf8mb4&parseTime=True&loc=Local"
	// 打开数据库连接
	db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
	if err != nil {
		fmt.Println("数据库连接失败", err)
		return
	}
	fmt.Println("数据库连接成功")
}
1.4.2 定义模型(结构体)

在 GORM 中,数据库表与 Go 语言的结构体进行映射。每个结构体的字段通常对应数据库表中的一列。

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

GORM 会根据结构体自动生成相应的数据库表。如果结构体字段发生变化,GORM 会尝试更新表结构。

1.4.3 插入数据(Create)

在 GORM 中插入数据非常简单,使用 Create() 方法即可将数据插入到表中。数据可以是结构体的实例。

user := User{Name: "John Doe", Email: "john@example.com", Age: 30}
result := db.Create(&user)
if result.Error != nil {
	fmt.Println("插入失败:", result.Error)
} else {
	fmt.Println("插入成功:", user.ID)
}
1.4.4 查询数据(Read)

GORM 提供了多种方式来查询数据,包括 First()Find()Where() 方法。

// 查询第一条记录
var user User
db.First(&user, 1) // 根据主键查询

// 查询所有记录
var users []User
db.Find(&users) // 查询所有记录

// 查询特定条件的数据
db.Where("age > ?", 25).Find(&users)
1.4.5 更新数据(Update)

更新数据通过 Update()Updates() 方法来实现。Update() 用于更新单个字段,而 Updates() 可以一次更新多个字段。

// 更新单个字段
db.Model(&user).Update("Age", 31)

// 更新多个字段
db.Model(&user).Updates(User{Name: "Jane Doe", Age: 32})
1.4.6 删除数据(Delete)

删除操作通过 Delete() 方法来执行。可以删除单条记录或者根据条件删除多条记录。

// 删除单条记录
db.Delete(&user)

// 删除符合条件的记录
db.Where("age < ?", 20).Delete(&User{})

1.5 总结

GORM 是 Go 语言中非常强大且易用的 ORM 库,能够简化数据库操作,提升开发效率。它提供了自动迁移、事务管理、一对多关系、链式查询等一系列强大功能,使得 Go 开发者能够更高效地与数据库交互。在 GORM 的帮助下,开发者可以专注于业务逻辑的实现,而无需担心繁琐的 SQL 编写和数据库细节。