G

[Golang] GORM框架 Session

RoLingG 2024-10-10

Session

在 GORM 中,Session 模式是指一组预定义的数据库操作,它们可以被用作数据库事务的模板。使用 Session 模式可以让你在处理复杂业务逻辑时,将数据库操作组织成一系列可重用的步骤,从而提高代码的可读性和可维护性。

GORM 的 Session 是一个结构体,它包含了一些用于配置数据库操作的字段。通过 Session,你可以定义如下行为:

  1. 事务:确保一系列操作在一个事务中执行,要么全部成功,要么全部失败。
  2. 数据库操作:如 CreateSaveDeleteFind 等。
  3. 钩子(Callbacks):在 Session 中定义的钩子会在特定的数据库操作之前或之后执行。
  4. 条件:定义一些条件,只有满足这些条件时,Session 中的操作才会执行。
  5. 数据库链:可以定义一系列数据库操作的链,如 FirstWhereOrder 等。

示例:

type Result struct {
    // Your struct fields
}

func main() {
    db, err := gorm.Open(sqlite.Open("test.db"), &gorm.Config{})
    if err != nil {
        log.Fatal("failed to connect database")
    }

    // Define a session
    session := db.Session(&gorm.Session{
        Write:   true, // Set this session to write operation
        NewDB:   true, // Create a new DB connection for this session
        Logger: db.Logger, // Use the default logger
    })

    // Define a transaction
    tx := session.Begin()

    // Use the transaction
    result := &Result{}
    if tx.First(result, "id = ?", 10).Error != nil {
        tx.Rollback() // Rollback if there is an error
    } else {
        // Do something with the result
    }

    // Commit the transaction
    if err := tx.Commit().Error; err != nil {
        log.Fatal("failed to commit transaction")
    }
}

在这个例子中,我们首先定义了一个 Session,然后使用这个 Session 开始一个事务。在事务中,我们执行了一次查询操作。如果查询成功,我们可以继续处理结果;如果查询失败,我们回滚事务。

  • 使用 Session 模式时,你需要明确事务的开始和结束。
  • Session 模式提供了更细粒度的控制,包括对数据库连接、事务和日志的控制。
创建一个新的 Session 可以让您隔离一系列数据库操作,确保这些操作的配置(如日志记录器)不会影响全局的 DB 实例。

Gorm里面的 Session 结构体:

GORM 提供了 Session 方法,这是一个 New Session Method,它允许创建带配置的新建会话模式:

// Session 配置
type Session struct {
  DryRun                   bool
  PrepareStmt              bool
  NewDB                    bool
  Initialized              bool
  SkipHooks                bool
  SkipDefaultTransaction   bool
  DisableNestedTransaction bool
  AllowGlobalUpdate        bool
  FullSaveAssociations     bool
  QueryFields              bool
  Context                  context.Context
  Logger                   logger.Interface
  NowFunc                  func() time.Time
  CreateBatchSize          int
}

这里面的字段具体用处:

  1. DryRun:

    • 布尔值,如果设置为 true,则不会执行实际的数据库操作,而是模拟执行并返回可能执行的 SQL 语句。
  2. PrepareStmt:

    • 布尔值,如果设置为 true,则会为当前 Session 中的所有操作准备 SQL 语句,这有助于提高性能,特别是对于复杂的查询。
  3. NewDB:

    • 布尔值,如果设置为 true,则会为当前 Session 创建一个新的数据库连接,而不是使用默认的连接池。
  4. Initialized:

    • 布尔值,用于标记 Session 是否已经被初始化。
  5. SkipHooks:

    • 布尔值,如果设置为 true,则会跳过模型的钩子(callbacks),例如 BeforeSaveAfterSave 等。
  6. SkipDefaultTransaction:

    • 布尔值,如果设置为 true,则会跳过默认的事务处理,即使在事务中也不会自动提交或回滚。
  7. DisableNestedTransaction:

    • 布尔值,如果设置为 true,则禁用嵌套事务,即使在事务中也不会创建新的事务层。
  8. AllowGlobalUpdate:

    • 布尔值,如果设置为 true,则允许使用全局更新,即使没有指定 WHERE 条件。
  9. FullSaveAssociations:

    • 布尔值,如果设置为 true,则在保存模型时,会递归保存所有关联的模型。
  10. QueryFields:

    • 布尔值,如果设置为 true,则在查询时只加载指定的字段,而不是全部字段。
  11. Context:

    • context.Context 类型,用于在数据库操作中传递上下文信息,如取消信号或超时。
  12. Logger:

    • logger.Interface 类型,用于配置自定义的日志记录器,以便控制日志的输出。
  13. NowFunc:

    • 函数,返回当前时间。GORM 会使用这个函数来生成时间戳,默认使用 time.Now
  14. CreateBatchSize:

    • 整数,用于设置批量创建记录时的批次大小。
具体更详细的内容还是请看官方文档的讲解吧:https://gorm.io/zh_CN/docs/session.html

总结

Session 是GORM中很好用的隔离数据库操作的模式,常和事务在一块一起使用。

PREV
[Golang] GORM框架 Scope
NEXT
[Golang] GORM框架 钩子

评论(0)

发布评论