我发现了一个使用 Clean Architecture 方法在存储库之间进行事务的一个很好的例子。
这家伙正在使用Gorm。
Gorm 具有相同的数据库连接和事务类型,例如:
var db *gorm.DB
var tx *gorm.DB
我是go-pg
. 但是这里的类型是不同的(也许它甚至更好),例如:
var db *pg.DB
var tx *pg.Tx
当然,错误是:Cannot use 'tx' (type *Tx) as type *pg.DB
一个小复制:
package main
import (
"github.com/go-pg/pg/v10"
)
type Player struct {
ID int
Name string
}
type PlayerRepo struct {
db *pg.DB
teamRepo *TeamRepo
}
type TeamRepo struct {
db *pg.DB
}
func NewPlayerRepo(db *pg.DB) *PlayerRepo {
return &PlayerRepo{
db: db,
teamRepo: NewTeamRepo(db),
}
}
func NewTeamRepo(db *pg.DB) *TeamRepo {
return &TeamRepo{db: db}
}
func (r *PlayerRepo) Find(id int) (*Player, error) {
var player Player
err := r.db.Model(&player).Where("id = ?", id).Select()
if err != nil {
return nil, err
}
return &player, nil
}
func (r *PlayerRepo) All() ([]*Player, error) {
// Long code
return nil, nil
}
func (r *PlayerRepo) Insert() (*Player, error) {
// Long code
return nil, nil
}
func (r *PlayerRepo) Update() (*Player, error) {
// Long code
return nil, nil
}
func (r *PlayerRepo) Delete() (*Player, error) {
// Long code
return nil, nil
}
func (r *PlayerRepo) WithTransaction(txFunc func(*PlayerRepo) error) (err error) {
tx, _ := r.db.Begin()
manager := NewPlayerRepo(tx) // <<<--- here the problem! tx is not good here, it's `pg.Tx` not `pg.DB`
err = txFunc(manager)
return
}
我能做些什么来解决这个问题?
提前致谢。❤️