blog/internal/repository/base_repository.go

68 lines
1.5 KiB
Go

package repository
import (
"sync"
"github.com/sirupsen/logrus"
"gorm.io/gorm"
)
type baseRep[T any] struct {
*gorm.DB
Mutex *sync.RWMutex
TableName string
}
func (rep *baseRep[T]) WGorm(txFunc func(tx *gorm.DB) error) error {
rep.Mutex.Lock()
err := rep.Transaction(txFunc)
rep.Mutex.Unlock()
return err
}
func (repository *baseRep[T]) GetById(id string) (ret *T) {
ret = new(T)
sql := repository.ToSQL(func(tx *gorm.DB) *gorm.DB {
return tx.Table(repository.TableName).First(ret, "id = ?", id)
})
logrus.Debug("执行的SQL:", sql)
err := repository.Table(repository.TableName).First(ret, "id = ?", id).Error
if err != nil {
logrus.Error(err)
return nil
}
return ret
}
func (repository *baseRep[T]) FindList(order interface{}, conds ...interface{}) (ret []T) {
sql := repository.ToSQL(func(tx *gorm.DB) *gorm.DB {
return tx.Table(repository.TableName).Find(&ret, conds...)
})
logrus.Debug("执行的SQL:", sql)
db := repository.Table(repository.TableName)
if order != nil {
db = db.Order(order)
}
err := db.Find(&ret, conds...).Error
if err != nil {
logrus.Info(err)
return nil
}
return ret
}
func (repository *baseRep[T]) FindOne(conds ...interface{}) (ret *T) {
ret = new(T)
sql := repository.ToSQL(func(tx *gorm.DB) *gorm.DB {
return tx.Table(repository.TableName).First(ret, conds...)
})
logrus.Debug("执行的SQL:", sql)
err := repository.Table(repository.TableName).First(ret, conds...).Error
if err != nil {
logrus.Info(err)
return nil
}
return ret
}