Session
在 GORM 中,Session
模式是指一组预定义的数据库操作,它们可以被用作数据库事务的模板。使用 Session
模式可以让你在处理复杂业务逻辑时,将数据库操作组织成一系列可重用的步骤,从而提高代码的可读性和可维护性。
GORM 的 Session
是一个结构体,它包含了一些用于配置数据库操作的字段。通过 Session
,你可以定义如下行为:
- 事务:确保一系列操作在一个事务中执行,要么全部成功,要么全部失败。
- 数据库操作:如
Create
、Save
、Delete
、Find
等。 - 钩子(Callbacks):在
Session
中定义的钩子会在特定的数据库操作之前或之后执行。 - 条件:定义一些条件,只有满足这些条件时,
Session
中的操作才会执行。 - 数据库链:可以定义一系列数据库操作的链,如
First
、Where
、Order
等。
示例:
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
}
这里面的字段具体用处:
DryRun:
- 布尔值,如果设置为
true
,则不会执行实际的数据库操作,而是模拟执行并返回可能执行的 SQL 语句。
- 布尔值,如果设置为
PrepareStmt:
- 布尔值,如果设置为
true
,则会为当前Session
中的所有操作准备 SQL 语句,这有助于提高性能,特别是对于复杂的查询。
- 布尔值,如果设置为
NewDB:
- 布尔值,如果设置为
true
,则会为当前Session
创建一个新的数据库连接,而不是使用默认的连接池。
- 布尔值,如果设置为
Initialized:
- 布尔值,用于标记
Session
是否已经被初始化。
- 布尔值,用于标记
SkipHooks:
- 布尔值,如果设置为
true
,则会跳过模型的钩子(callbacks),例如BeforeSave
、AfterSave
等。
- 布尔值,如果设置为
SkipDefaultTransaction:
- 布尔值,如果设置为
true
,则会跳过默认的事务处理,即使在事务中也不会自动提交或回滚。
- 布尔值,如果设置为
DisableNestedTransaction:
- 布尔值,如果设置为
true
,则禁用嵌套事务,即使在事务中也不会创建新的事务层。
- 布尔值,如果设置为
AllowGlobalUpdate:
- 布尔值,如果设置为
true
,则允许使用全局更新,即使没有指定WHERE
条件。
- 布尔值,如果设置为
FullSaveAssociations:
- 布尔值,如果设置为
true
,则在保存模型时,会递归保存所有关联的模型。
- 布尔值,如果设置为
QueryFields:
- 布尔值,如果设置为
true
,则在查询时只加载指定的字段,而不是全部字段。
- 布尔值,如果设置为
Context:
context.Context
类型,用于在数据库操作中传递上下文信息,如取消信号或超时。
Logger:
logger.Interface
类型,用于配置自定义的日志记录器,以便控制日志的输出。
NowFunc:
- 函数,返回当前时间。GORM 会使用这个函数来生成时间戳,默认使用
time.Now
。
- 函数,返回当前时间。GORM 会使用这个函数来生成时间戳,默认使用
CreateBatchSize:
- 整数,用于设置批量创建记录时的批次大小。
具体更详细的内容还是请看官方文档的讲解吧:https://gorm.io/zh_CN/docs/session.html
总结
Session
是GORM中很好用的隔离数据库操作的模式,常和事务在一块一起使用。
评论(0)