使用 GORM 连接 PGSQL 数据库并实现增删改查操作教程 | 青训营

前言

本教程将介绍如何在 Go 语言中使用 GORM 连接 PostgreSQL 数据库,并演示如何执行数据库的增、删、改、查操作。GORM 是一个强大的 Go 语言 ORM(对象关系映射)库,可以大大简化数据库操作。

前提条件:
在开始之前,确保你已经安装了 Go 编程语言以及相关的开发环境。另外,你需要一个已经安装和配置好的 PostgreSQL 数据库。

gorm 基本使用(curd)

步骤 1:安装 GORM
首先,我们需要安装 GORM。在终端中执行以下命令:

go get -u github.com/go-gorm/gorm

步骤 2:创建数据库连接
在 Go 代码中,创建一个连接到 PostgreSQL 数据库的代码。在你的代码中引入 GORM 和 PostgreSQL 驱动包:

import (
    "gorm.io/driver/postgres"
    "gorm.io/gorm"
)

然后,创建一个数据库连接:

func main() {
    dsn := "host=127.0.0.1 user=yourusername password=yourpassword dbname=userDB port=5432 sslmode=disable"
    db, err := gorm.Open(postgres.Open(dsn), &gorm.Config{})
    if err != nil {
        panic("Failed to connect to database")
    }

    // 接下来的步骤将在此基础上进行操作
}

步骤 3:定义模型
在 GORM 中,模型是数据库表的映射。我们定义一个模型结构体来映射数据库表。例如,假设我们有一个 User 表,创建一个对应的模型:

type User struct {
    gorm.Model
    Name  string
    Email string
}

步骤 4:创建库表

ALTER DATABASE template1 REFRESH COLLATION VERSION; // 更新模板
CREATE DATABASE "userDB" WITH OWNER = "postgres"; // 创建userDB数据库
// ... 连接数据库代码 ...

// 自动创建名为 "users" 的表
err = db.AutoMigrate(&User{})
if err != nil {
	return
}

步骤 4:创建数据
使用 GORM,我们可以通过以下方式创建一条新的数据记录:

func main() {
    // ... 连接数据库代码 ...

    newUser := User{Name: "Alice", Email: "[email protected]"}
    db.Create(&newUser)
}

步骤 5:查询数据
以下代码演示如何使用 GORM 查询数据:

func main() {
    // ... 连接数据库代码 ...

    var user User
    db.First(&user, 1) // 查询 ID 为 1 的用户
    fmt.Println(user.Name, user.Email)
}

步骤 6:更新数据
使用 GORM,你可以轻松地更新数据记录:

func main() {
    // ... 连接数据库代码 ...

    var user User
    db.First(&user, 1) // 查询 ID 为 1 的用户
    user.Name = "NewName"
    user.Email = "[email protected]"
    db.Save(&user)
}

步骤 7:删除数据
要删除数据记录,可以使用以下代码:

func main() {
    // ... 连接数据库代码 ...

    var user User
    db.First(&user, 1) // 查询 ID 为 1 的用户
    db.Delete(&user)
}

总结:
通过本教程,你学会了如何使用 GORM 在 Go 中连接 PostgreSQL 数据库,并执行增、删、改、查操作。GORM 的强大功能可以极大地简化数据库操作,帮助你更轻松地管理数据。在实际开发中,你可以根据需要进一步扩展和优化这些操作。

gorm 数据库事务

在 GORM 中,事务用于管理数据库操作的一系列动作,以确保它们要么全部成功执行,要么全部回滚。事务在需要同时进行多个操作时,确保数据库始终保持一致状态非常有用,因为如果其中一个操作失败,整个事务可以被回滚,从而避免了数据库状态不一致的问题。下面是如何在 GORM 中使用事务的简要讲解:

步骤 1:开启事务
要使用事务,你需要通过 Begin 方法在数据库上开启一个事务:

tx := db.Begin()

这将返回一个事务对象 tx,它将用于后续的数据库操作。

步骤 2:执行操作
在事务中,你可以执行各种数据库操作,例如插入、更新、删除等:

tx.Create(&User{Name: "Alice", Email: "[email protected]"})
tx.Update("email", "[email protected]")
tx.Delete(&user)

步骤 3:提交事务
如果所有操作都成功,你可以使用 Commit 方法提交事务:

err := tx.Commit().Error
if err != nil {
    // 处理提交事务时的错误
}

如果提交成功,事务中的操作将被应用到数据库。

步骤 4:回滚事务
如果在事务中的任何操作失败或出现错误,你可以使用 Rollback 方法回滚事务,以撤消所有在事务中进行的更改:

err := tx.Rollback().Error
if err != nil {
    // 处理回滚事务时的错误
}

完整示例:
以下是一个完整的示例,演示如何使用 GORM 进行事务操作:

func main() {
    // ... 连接数据库代码 ...

    tx := db.Begin()

    newUser := User{Name: "Alice", Email: "[email protected]"}
    if err := tx.Create(&newUser).Error; err != nil {
        tx.Rollback()
        fmt.Println("Failed to create user:", err)
        return
    }

    if err := tx.Update("email", "[email protected]").Error; err != nil {
        tx.Rollback()
        fmt.Println("Failed to update user:", err)
        return
    }

    var user User
    if err := tx.First(&user, 1).Error; err != nil {
        tx.Rollback()
        fmt.Println("Failed to fetch user:", err)
        return
    }

    if err := tx.Commit().Error; err != nil {
        tx.Rollback()
        fmt.Println("Transaction failed:", err)
    }
}

总结:
使用 GORM 进行事务操作可以确保一系列数据库操作要么全部成功,要么全部回滚。通过适当的错误处理,你可以保证事务的一致性,并在必要时回滚操作以避免数据库状态不一致。

gorm tags

在 GORM 中,字段标签(Tags)用于为模型的字段指定数据库列的属性、约束和行为。通过使用不同的字段标签,你可以对模型的字段进行自定义配置,以适应特定的数据库需求和业务逻辑。以下是一些常用的字段标签及其作用:

1. column 标签:
column 标签用于指定数据库中对应列的名称。这在字段名与数据库列名不一致时非常有用。

type User struct {
    gorm.Model
    Name  string `gorm:"column:full_name"`
}

在这个例子中,Name 字段在数据库中映射为 “full_name” 列。

2. type 标签:
type 标签用于指定数据库列的数据类型。它可以用于在模型中使用不同的数据类型来表示某个字段,而在数据库中使用特定的数据类型。

type Product struct {
    gorm.Model
    Price float64 `gorm:"type:decimal(10,2)"`
}

在这个例子中,Price 字段在数据库中使用 decimal(10,2) 数据类型。

3. unique 标签:
unique 标签用于指定字段的唯一性约束,确保数据库中不会存在重复的值。

type User struct {
    gorm.Model
    Email string `gorm:"unique"`
}

在这个例子中,Email 字段具有唯一性约束。

4. default 标签:
default 标签用于指定字段的默认值,在插入新记录时如果未指定该字段的值,将使用默认值。

type Product struct {
    gorm.Model
    Status string `gorm:"default:'pending'"`
}

在这个例子中,Status 字段在插入新记录时将默认为 “pending”。

5. primary_key 标签:
primary_key 标签用于将字段指定为主键。如果你想要自定义主键名称,也可以在 column 标签中指定。

type User struct {
    ID    int    `gorm:"primary_key"`
    Name  string
    Email string
}

在这个例子中,ID 字段将作为主键。

6. not null 标签:
GORM 默认会将 Go 中的零值(例如,整数为 0,字符串为空字符串)映射到数据库的 NULL 值。如果你想要禁止将字段映射为 NULL,可以使用 not null 标签。

type User struct {
    gorm.Model
    Name  string `gorm:"not null"`
}

在这个例子中,Name 字段不允许为空。

这只是一些常见的字段标签示例,GORM 还支持许多其他标签,如索引标签、大小限制标签等,可以根据你的具体需求进行配置。使用字段标签可以轻松地自定义模型的映射行为,使其与数据库的交互更加精细和灵活。

最后

GORM(Go ORM)是一个在 Go 语言中使用的对象关系映射(ORM)库,它提供了一种方便的方式来管理数据库操作,抽象化了数据库操作的细节,使开发者能够更专注于应用程序的业务逻辑。GORM 支持多种数据库,包括 PostgreSQL、MySQL、SQLite 等,它具有以下特点:

  1. 简化数据库操作: GORM 提供了高级的 API 来执行数据库的增删改查操作,大大简化了数据库操作的流程。

  2. 模型映射: GORM 支持将 Go 结构体映射到数据库表,使开发者能够以面向对象的方式来操作数据。

  3. 事务支持: GORM 提供了事务支持,可以确保一系列数据库操作要么全部成功,要么全部回滚,保证数据的一致性。

  4. 查询构建器: GORM 提供了强大的查询构建器,允许开发者使用链式方法构建复杂的查询语句,从而轻松实现灵活的数据检索。

  5. 钩子功能: GORM 允许你在模型对象的生命周期中添加各种钩子函数,用于在创建、更新、删除等操作之前或之后执行自定义逻辑。

  6. 关联关系: GORM 支持定义不同表之间的关联关系,如一对多、多对多等,使数据关联操作更加方便。

  7. 迁移工具: GORM 提供了数据库迁移工具,使数据库模式的升级和维护变得更加简单。

  8. 文档丰富: GORM 提供了详细的文档和示例,对于初学者和有经验的开发者都非常友好。

评价:

GORM 是一个受欢迎的 Go ORM 库,它在 Go 社区中拥有广泛的用户基础和积极的开发社区。它的设计哲学在于提供简单易用的 API,同时又保留了足够的灵活性来处理各种复杂场景。以下是 GORM 的一些优点和考虑因素:

优点:

  1. 易用性: GORM 的 API 设计使得数据库操作变得非常直观和易于理解,降低了学习和使用的门槛。

  2. 查询构建器: 强大的查询构建器让开发者能够构建复杂的查询语句,而不必手动编写 SQL。

  3. 文档和示例: GORM 提供了清晰的文档和丰富的示例,使得开发者能够快速上手和解决问题。

  4. 事务支持: 内置的事务支持使得处理复杂的操作序列变得更加容易,保证了数据的一致性。

  5. 社区支持: GORM 在 Go 社区中有着强大的用户和开发者支持,有很多第三方资源和扩展可以使用。

考虑因素:

  1. 性能: 尽管 GORM 提供了方便的抽象,但在一些高性能的场景下,直接使用原生 SQL 可能更有优势。

  2. 复杂性: 在处理一些复杂的关联和查询时,GORM 的自动生成可能不总是满足性能需求,需要谨慎评估和优化。

总的来说,GORM 是一个功能强大、易于使用的 ORM 库,适用于大多数中小型应用程序。对于复杂的性能需求,可能需要在 GORM 和原生 SQL 之间做出权衡。