Go语言数据库编程:数据迁移与事务控制

简介: 本文介绍了《Go语言实战指南》中关于数据库编程的核心内容,涵盖使用 GORM 进行数据迁移与事务控制。主要内容包括:AutoMigrate 方法自动创建或更新表结构;事务控制的自动与手动实现方式;事务隔离级别的设置;以及在 Gin 框架中统一管理事务的实践建议。适合开发阶段的数据库结构管理和事务性操作需求。

 

以下是《Go语言实战指南》中关于 数据库编程:数据迁移与事务控制 的核心内容,适用于使用 GORM 进行数据库表结构管理与事务性操作。


一、数据迁移(AutoMigrate)

GORM 提供 AutoMigrate() 方法可根据结构体自动创建或更新数据库表结构,适合开发阶段使用。

1. 自动创建表结构

db.AutoMigrate(&User{})
  • • 会创建表、缺失字段、索引。
  • 不会删除字段、修改字段类型,所以是“非破坏性迁移”。
  • • 多个模型可一并迁移:
db.AutoMigrate(&User{}, &Product{}, &Order{})

2. 常见字段标签

GORM 标签 功能说明
primaryKey 主键
uniqueIndex 唯一索引
size:255 设置字段长度
default:'abc' 设置默认值
not null 不允许为 NULL

3. 嵌套字段自动迁移

type Address struct {
    City string
    Zip  string
}
type User struct {
    gorm.Model
    Name    string
    Address Address `gorm:"embedded"`
}

二、事务控制(Transaction)

在实际开发中,涉及多个数据库操作时应使用事务保证一致性。

1. 使用 db.Transaction() 执行事务

err := db.Transaction(func(tx *gorm.DB) error {
    if err := tx.Create(&User{Name: "Tom"}).Error; err != nil {
        return err
    }
    if err := tx.Create(&Order{UserID: 1, Amount: 100}).Error; err != nil {
        return err
    }
    return nil // 提交事务
})
if err != nil {
    log.Println("事务失败:", err)
}
  • • 返回 nil:自动提交。
  • • 返回 error:自动回滚。

2. 手动控制事务(更细粒度)

tx := db.Begin()
defer func() {
    if r := recover(); r != nil {
        tx.Rollback()
    }
}()
if err := tx.Create(&User{Name: "Alice"}).Error; err != nil {
    tx.Rollback()
    return
}
if err := tx.Create(&Order{UserID: 1}).Error; err != nil {
    tx.Rollback()
    return
}
tx.Commit()

✅ 遇 panic 时可通过 defer + recover 回滚事务,防止程序异常提交。


三、事务的隔离级别(可选配置)

使用 Set 方法可设置隔离级别:

db.Session(&gorm.Session{
    Isolation: "REPEATABLE READ",
}).Transaction(func(tx *gorm.DB) error {
    // 操作...
    return nil
})

常见的隔离级别有:

  • READ UNCOMMITTED
  • READ COMMITTED
  • REPEATABLE READ(MySQL 默认)
  • SERIALIZABLE

四、在 Gin 项目中统一管理事务(实践建议)

如果你使用的是 Gin 框架,可以在中间件中开启事务,将事务对象绑定到 context.Context 中,在业务层统一使用:

// 开启事务中间件
func TransactionMiddleware(db *gorm.DB) gin.HandlerFunc {
    return func(c *gin.Context) {
        tx := db.Begin()
        c.Set("tx", tx)
        c.Next()
        if len(c.Errors) > 0 {
            tx.Rollback()
        } else {
            tx.Commit()
        }
    }
}

业务中获取并使用:

tx := c.MustGet("tx").(*gorm.DB)
tx.Create(&User{})

五、小结

功能点 方法 / 实践
自动迁移 db.AutoMigrate(&Model{})
表结构控制 通过 GORM 标签控制字段属性
简单事务 db.Transaction(func(tx *gorm.DB) error)
手动事务 Begin / Commit / Rollback
项目实践 中间件中开启事务,绑定到上下文使用

 

相关文章
|
SQL 关系型数据库 MySQL
乐观锁在分布式数据库中如何与事务隔离级别结合使用
乐观锁在分布式数据库中如何与事务隔离级别结合使用
173 5
|
SQL 关系型数据库 MySQL
乐观锁在分布式数据库中如何与事务隔离级别结合使用
乐观锁在分布式数据库中如何与事务隔离级别结合使用
|
SQL 关系型数据库 MySQL
如何快速在表级别做同构或者异构数据库之间的数据迁移/备份
【8月更文挑战第17天】本文介绍在同构与异构数据库间快速迁移/备份表级数据的方法。同构迁移可利用数据库自带工具(如MySQL的`mysqldump`)或管理软件(如phpMyAdmin);异构迁移则推荐使用ETL工具(如Pentaho Data Integration)或数据库复制工具(如SymmetricDS),亦可通过编程方式实现。实施前需测试以确保数据完整准确,并注意处理兼容性问题。
583 4
|
SQL 数据库 数据安全/隐私保护
SQL Server数据库Owner导致事务复制log reader job无法启动的解决办法
【8月更文挑战第14天】解决SQL Server事务复制Log Reader作业因数据库所有者问题无法启动的方法:首先验证数据库所有者是否有效并具足够权限;若非,使用`ALTER AUTHORIZATION`更改为有效登录名。其次,确认Log Reader使用的登录名拥有读取事务日志所需的角色权限。还需检查复制配置是否准确无误,并验证Log Reader代理的连接信息及参数。重启SQL Server Agent服务或手动启动Log Reader作业亦可能解决问题。最后,审查SQL Server错误日志及Windows事件查看器以获取更多线索。
194 0
|
8月前
|
SQL 数据库 索引
【YashanDB数据库】大事务回滚导致其他操作无法执行,报错YAS-02016 no free undo blocks
大事务回滚导致其他操作无法执行,报错YAS-02016 no free undo blocks
|
11月前
|
SQL 存储 Java
数据库———事务及bug的解决
事务的一些概念,并发事务以及并发事务引起的bug,脏读,不可重复读,幻读,数据库中的隔离级别,事务的简单应用
|
数据库
什么是数据库的事务隔离级别,有什么作用
【10月更文挑战第21】什么是数据库的事务隔离级别,有什么作用
194 3
|
存储 关系型数据库 数据挖掘
什么是数据库的事务隔离级别
【10月更文挑战第21】什么是数据库的事务隔离级别
349 1
|
存储 数据库 数据库管理
数据库事务安全性控制如何实现呢
【10月更文挑战第15天】数据库事务安全性控制如何实现呢
|
存储 数据库 数据库管理
什么是数据库事务安全性控制
【10月更文挑战第15天】什么是数据库事务安全性控制

热门文章

最新文章