package
0.0.0-20240919142821-8147e5b35ad2
Repository: https://github.com/go-eagle/eagle-layout.git
Documentation: pkg.go.dev

# README

Models

数据模型层

特别说明

关于事务的使用,在 service 层开始事务,将待执行的 repo 方法封装在 fn 参数中,
传递给 gorm 实例的 Transaction() 方法待执行。

同时在 Transcation 内部,触发 fn() 函数,也就是聚合的N个 repo 操作,
需要注意的是,此时 contextTxKey 将携带事务 tx 的 ctx 作为参数传递给了
fn 函数,因此下游的两个 repo 可以获取到 service 层的事务会话。

// geeeter_svc.go
// CreateGreeter creates a Greeter, and returns the new Greeter.
func (s *GreeterService) CreateGreeter(ctx context.Context, g *Greeter) (*Greeter, error) {
   s.log.WithContext(ctx).Infof("CreateGreeter: %v", g.Hello)
   var (
      greater *Greeter
      err     error
   )
   // 开始使用事务
   err = s.db.ExecTx(ctx, func(ctx context.Context) error {
      // 更新所有 hello 为 hello + "updated",且插入新的 hello
      greater, err = s.repo.Save(ctx, g)
      _, err = s.repo.Update(ctx, g)
      return err
   })
   if err != nil {
      return nil, err
   }

   return greater, nil
}

在 repo 层执行数据库操作的时候,尝试通过 DBTx() 方法,从 ctx 中获取到上游传递
下来的事务会话,如果有则使用,如果没有,则使用 repo 层自己持有的 DB,进行数据访问操作。

举例如下:

// geeeter_repo.go
func (r *greeterRepo) Save(ctx context.Context, g *model.Greeter) (*model.Greeter, error) {
    result := r.db.DBTx(ctx).Create(g)
    return g, result.Error
}
​
func (r *greeterRepo) Update(ctx context.Context, g *model.Greeter) (*model.Greeter, error) {
    result := r.db.DBTx(ctx).Model(&model.Greeter{}).Where("hello = ?", g.Hello).Update("hello", g.Hello+"updated")
    if result.RowsAffected == 0 {
        return nil, fmt.Errorf("greeter %s not found", g.Hello)
    }
    return nil, fmt.Errorf("custom error")
}

References

# Functions

Init init db.

# Variables

DB define a gloabl db.

# Structs

No description provided by the author
UserModel define a user base info struct.