Golang Grimoire库v1.2.0版本发布

Golang Grimoire库v1.2.0版本发布 大家好,

Grimoire v1.2.0 版本更新内容:

  • 支持嵌套事务(#37
  • 新增 changeset.PutAssoc(#35
  • 新增 changeset.Change

Grimoire 是一个受 Ecto 启发的数据库访问层。它具有灵活的查询 API 和内置验证功能。目前支持 MySQL、PostgreSQL 和 SQLite3,但可以通过适配器接口轻松实现自定义适配器。

GitHub GitHub

头像

Fs02/grimoire

Go 语言的数据库访问层。通过在 GitHub 上创建账户来为 Fs02/grimoire 的开发做出贡献。


更多关于Golang Grimoire库v1.2.0版本发布的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于Golang Grimoire库v1.2.0版本发布的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


Grimoire v1.2.0 版本带来了几个重要的功能增强,特别是嵌套事务支持和新的 changeset 方法,这对处理复杂数据库操作非常有用。以下是对这些更新的简要说明和示例代码:

嵌套事务支持

嵌套事务允许在现有事务中开启子事务,这在需要部分操作回滚时特别实用。例如:

import (
    "github.com/Fs02/grimoire"
    "github.com/Fs02/grimoire/adapter/sqlite3"
)

func main() {
    // 初始化适配器
    adapter, _ := sqlite3.Open(":memory:")
    repo := grimoire.New(adapter)

    // 开启主事务
    tx, _ := repo.Begin()
    defer tx.Rollback() // 确保回滚

    // 执行一些操作
    tx.Insert("users", grimoire.Map{"name": "Alice"})

    // 开启嵌套事务
    nestedTx, _ := tx.Begin()
    nestedTx.Insert("posts", grimoire.Map{"title": "Hello"})
    
    // 如果嵌套事务失败,可以回滚而不影响主事务
    // nestedTx.Rollback()
    
    // 提交嵌套事务
    nestedTx.Commit()

    // 提交主事务
    tx.Commit()
}

changeset.PutAssoc 方法

changeset.PutAssoc 用于处理关联数据的更新,例如在用户模型中更新关联的帖子:

import "github.com/Fs02/grimoire/changeset"

type User struct {
    ID    int
    Name  string
    Posts []Post
}

type Post struct {
    ID     int
    Title  string
    UserID int
}

func main() {
    user := User{ID: 1, Name: "Bob"}
    posts := []Post{{Title: "Post1"}, {Title: "Post2"}}

    // 创建 changeset 并设置关联
    ch := changeset.Cast(user, []string{"name"})
    changeset.PutAssoc(ch, "posts", posts)

    // 使用 repo 更新数据库
    // repo.Update("users", ch)
}

changeset.Change 方法

changeset.Change 允许手动设置字段变更,这在动态构建更新时很有用:

func main() {
    user := User{ID: 1, Name: "Charlie"}
    ch := changeset.Cast(user, []string{"name"})

    // 手动添加变更
    changeset.Change(ch, "age", 30)

    // 检查变更
    if changeset.GetChange(ch, "age") != nil {
        // 处理更新
    }
}

这些更新进一步强化了 Grimoire 作为 Go 语言中灵活数据库层的能力,特别是在处理事务和关联数据时。开发者可以参考官方文档和 GitHub 发布页面获取更多细节。

回到顶部