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

27 阅读8分钟

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

GORM 是一个优秀的 Go 语言 ORM(对象关系映射)库,它可以让我们用 Go 语言的结构体和方法来操作各种关系型数据库,如 MySQL、PostgreSQL、SQLite 等。GORM 提供了丰富的功能和灵活的接口,让我们可以轻松地实现数据库的增删改查操作。本文将介绍如何使用 GORM 连接数据库,并实现一些常见的增删改查操作。

安装和导入 GORM

要使用 GORM,我们首先需要安装它和对应的数据库驱动。使用 go get 命令来安装:

go get -u gorm.io/gorm
go get -u gorm.io/driver/mysql // 如果使用 MySQL 数据库
go get -u gorm.io/driver/postgres // 如果使用 PostgreSQL 数据库
go get -u gorm.io/driver/sqlite // 如果使用 SQLite 数据库

然后,导入 GORM 包和对应的数据库驱动包:

import (
  "gorm.io/gorm"
  _ "gorm.io/driver/mysql" // 如果使用 MySQL 数据库
  _ "gorm.io/driver/postgres" // 如果使用 PostgreSQL 数据库
  _ "gorm.io/driver/sqlite" // 如果使用 SQLite 数据库
)

连接数据库

要连接数据库,我们需要使用 gorm.Open 函数,它接受两个参数:一个是数据库驱动的名称,一个是数据库的连接字符串。不同的数据库驱动可能有不同的连接字符串格式,我们可以参考 GORM 的文档1来了解具体的用法。例如,如果我们要连接 MySQL 数据库,我们可以这样写:

db, err := gorm.Open(mysql.Open("user:password@tcp(localhost:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local"), &gorm.Config{})

如果我们要连接 PostgreSQL 数据库,我们可以这样写:

css
 代码解读
复制代码
db, err := gorm.Open(postgres.Open("user=gorm password=gorm dbname=gorm port=9920 sslmode=disable TimeZone=Asia/Shanghai"), &gorm.Config{})

如果要连接 QLite 数据库,可以这样写:

db, err := gorm.Open(sqlite.Open("test.db"), &gorm.Config{})

gorm.Open 函数会返回一个 *gorm.DB 类型的值,它代表了一个数据库连接池。我们可以通过它来执行后续的数据库操作。如果连接失败,它会返回一个错误值。因此,我们需要检查错误并处理异常情况:

if err != nil {
  // 处理错误
}

另外,当不再需要使用数据库时,我们应该关闭连接池,以释放资源。我们可以使用 sql.DB 类型的 Close 方法来关闭连接池。由于 *gorm.DB 类型内嵌了 *sql.DB 类型,所以我们可以直接调用 db.Close() 方法:

defer db.Close()

定义模型

要使用 GORM 操作数据库,我们需要定义一些模型(Model),它们是 Go 语言的结构体(Struct),用来映射数据库中的表(Table)。GORM 提供了一些标签(Tag),让我们可以在结构体字段上添加一些元信息,来控制模型和表之间的映射规则。例如,我们可以指定表名、列名、主键、索引、约束等信息。以下是一个简单的模型定义的例子:

// User 模型对应 users 表
type User struct {
  ID       uint   `gorm:"primaryKey"` // ID 字段是主键
  Name     string `gorm:"size:64"` // Name 字段的大小是 64
  Email    string `gorm:"uniqueIndex"` // Email 字段是唯一索引
  Password string `gorm:"not null"` // Password 字段不能为空
}

创建表

有了模型之后,可以使用 GORM 来创建数据库中的表。GORM 提供了两种方式来创建表:自动迁移(Auto Migration)和手动创建(Manual Creation)。

自动迁移是指让 GORM 根据模型的定义,自动在数据库中创建或修改表结构。这种方式很方便,但也有一些限制,例如,它不会删除已经存在的列或索引,也不会修改已经存在的列类型。我们可以使用 *gorm.DB 类型的 AutoMigrate 方法来执行自动迁移:

// 根据 User 模型自动创建 users 表
db.AutoMigrate(&User{})

手动创建是指让 GORM 根据我们指定的 SQL 语句,手动在数据库中创建或修改表结构。这种方式很灵活,但也需要我们自己编写 SQL 语句,并注意数据库的兼容性。我们可以使用 *gorm.DB 类型的 Exec 方法来执行手动创建:

// 根据 SQL 语句手动创建 users 表
db.Exec("CREATE TABLE users (id int primary key, name varchar(64), email varchar(64) unique, password varchar(64) not null)")

增加数据

要向数据库中增加数据,我们需要创建一个模型的实例,并赋值给它的字段。然后,我们可以使用 *gorm.DB 类型的 Create 方法来执行插入操作:

// 创建一个 User 实例
user := User{
  Name: "Alice",
  Email: "alice@example.com",
  Password: "123456",
}
​
// 向 users 表中插入一条数据
db.Create(&user)

Create 方法会返回一个 *gorm.DB 类型的值,它包含了一些执行结果的信息,例如影响的行数、主键值、错误值等。我们可以通过这些信息来判断插入操作是否成功,并进行相应的处理:

result := db.Create(&user)
​
// 获取影响的行数
rows := result.RowsAffected
​
// 获取主键值
id := user.ID
​
// 获取错误值
err := result.Error
if err != nil {
  // 处理错误
}

查询数据

要从数据库中查询数据,我们可以使用 *gorm.DB 类型提供的一系列方法来构建查询条件,并最终使用 First、Find、Take 等方法来执行查询操作。以下是一些常见的查询方法:

  • Where:指定查询条件,可以使用字符串、结构体、Map 等形式。
  • Select:指定查询字段,可以使用字符串或切片等形式。
  • Order:指定排序规则,可以使用字符串或 Map 等形式。
  • Limit:指定查询限制,可以使用整数等形式。
  • Offset:指定查询偏移量,可以使用整数等形式。
  • Joins:指定关联查询,可以使用字符串等形式。
  • Preload:指定预加载关联数据,可以使用字符串或函数等形式。

以下是一些查询数据的例子:

// 查询主键为 1 的用户
var user User
db.First(&user, 1)
​
// 查询名字为 Alice 的用户
var user User
db.Where("name = ?", "Alice").First(&user)
​
// 查询邮箱包含 example 的用户,并只返回 id 和 name 字段,按照 id 升序排序,限制 10 条数据
var users []User
db.Select("id, name").Where("email LIKE ?", "%example%").Order("id asc").Limit(10).Find(&users)
​
// 查询用户关联的文章,并预加载文章关联的标签
var user User
db.Joins("Article").Preload("Article.Tags").First(&user, 1)

修改数据

要修改数据库中的数据,我们需要先查询出要修改的数据,然后修改它的字段值。然后,我们可以使用 *gorm.DB 类型的 Save 或 Update 方法来执行修改操作。以下是一些常见的修改方法:

  • Save:保存一个模型的所有字段到数据库中,即使它没有变化。
  • Update:更新一个或多个模型的指定字段到数据库中,只有发生变化的字段才会被更新。
  • Updates:更新一个模型的多个字段到数据库中,可以使用结构体或 Map 等形式。
  • Assign:分配一个或多个模型的指定字段的值,但不执行数据库操作,需要配合其他方法使用。
  • Omit:忽略一个或多个模型的指定字段,不执行数据库操作,需要配合其他方法使用。

以下是一些修改数据的例子:

// 查询主键为 1 的用户,并修改它的名字为 Bob
var user User
db.First(&user, 1)
user.Name = "Bob"
db.Save(&user)
​
// 查询主键为 2 的用户,并修改它的邮箱为 bob@example.com
var user User
db.First(&user, 2)
db.Model(&user).Update("email", "bob@example.com")
​
// 查询主键为 3 的用户,并修改它的名字和密码
var user User
db.First(&user, 3)
db.Model(&user).Updates(User{Name: "Charlie", Password: "654321"})
​
// 查询主键为 4 的用户,并分配它的名字和密码,但不执行数据库操作
var user User
db.First(&user, 4)
db.Model(&user).Assign(User{Name: "David", Password: "abcdef"})
​
// 查询主键为 5 的用户,并忽略它的密码,然后保存到数据库中
var user User
db.First(&user, 5)
user.Name = "Eve"
user.Email = "eve@example.com"
db.Omit("password").Save(&user)

删除数据

要删除数据库中的数据,我们需要先查询出要删除的数据,然后使用 *gorm.DB 类型的 Delete 方法来执行删除操作:

// 查询主键为 1 的用户,并删除它
var user User
db.First(&user, 1)
db.Delete(&user)

Delete 方法会返回一个 *gorm.DB 类型的值,它包含了一些执行结果的信息,例如影响的行数、错误值等。我们可以通过这些信息来判断删除操作是否成功,并进行相应的处理:

result := db.Delete(&user)
​
// 获取影响的行数
rows := result.RowsAffected
​
// 获取错误值
err := result.Error
if err != nil {
  // 处理错误
}

另外,我们也可以使用 Where 方法来指定删除条件,而不需要先查询出要删除的数据:

// 删除名字为 Alice 的用户
db.Where("name = ?", "Alice").Delete(&User{})

总结

本文介绍了如何使用 GORM 连接数据库,并实现一些常见的增删改查操作。GORM 是一个强大而灵活的 ORM 库,它可以让我们用简洁而优雅的 Go 语言来操作各种关系型数据库。GORM 还提供了很多其他的功能和特性,例如事务、关联、钩子、作用域等。我们可以参考 GORM 的文档来了解更多的用法和细节。