Gorm 查找结果到接口
Gorm Find result to interface
我正在尝试使用 Gorm 为我的 api 构建一个通用的 CrudRepository 结构。
我知道泛型将在版本 2 中出现在 GoLang 中,但我尝试使用反射或任何其他库构建此库。
在我的 CrudRepository 中:
func (repository *BaseRepository) find(result interface{}, pageSize int, page int) error {
if page < 1 {
return errors.ExceedsMinimumInt("page", "", 0, true, nil)
}
offset := (page - 1) * pageSize
ent := reflect.Zero(reflect.TypeOf(result))
repository.db = repository.db.Limit(pageSize).Offset(offset)
err := repository.db.Find(&ent).Error
result = ent
if err != nil {
return err
}
return nil
}
并像这样调用此方法:
func List(){
var entityList []MyEntity
find(entityList, 1, 10)
}
我想,我不能将任何接口引用传递给 Gorm.db.Find() 方法
还有其他方法可以成功吗?
使用切片的指针作为 custom find
方法的输入参数。
func (repository *BaseRepository) find(result interface{}, pageSize int, page int) error {
if page < 1 {
return errors.ExceedsMinimumInt("page", "", 0, true, nil)
}
if reflect.TypeOf(result).Kind() != reflect.Slice { check ❗️
return errors.New("`result` is not a slice")
}
offset := (page - 1) * pageSize
db = db.Limit(pageSize).Offset(offset)
if err := db.Find(result).Error; err != nil {
return err
}
return nil
}
用法
var entityList []MyEntity
err := find(&entityList, 10, 1)
您还必须检查输入参数 (result
),因为 db.Find
不适合查找单个支柱 (Retrieving a single object)
If you want to avoid the ErrRecordNotFound error, you could use Find
like db.Limit(1).Find(&user), the Find method accepts both struct and
slice data
例如(Book
table为空):
b := Book{}
rowsAffectedQuantity := db.Find(&b).RowsAffected // 0
err = db.Find(&b).Error // nil
我正在尝试使用 Gorm 为我的 api 构建一个通用的 CrudRepository 结构。 我知道泛型将在版本 2 中出现在 GoLang 中,但我尝试使用反射或任何其他库构建此库。
在我的 CrudRepository 中:
func (repository *BaseRepository) find(result interface{}, pageSize int, page int) error {
if page < 1 {
return errors.ExceedsMinimumInt("page", "", 0, true, nil)
}
offset := (page - 1) * pageSize
ent := reflect.Zero(reflect.TypeOf(result))
repository.db = repository.db.Limit(pageSize).Offset(offset)
err := repository.db.Find(&ent).Error
result = ent
if err != nil {
return err
}
return nil
}
并像这样调用此方法:
func List(){
var entityList []MyEntity
find(entityList, 1, 10)
}
我想,我不能将任何接口引用传递给 Gorm.db.Find() 方法 还有其他方法可以成功吗?
使用切片的指针作为 custom find
方法的输入参数。
func (repository *BaseRepository) find(result interface{}, pageSize int, page int) error {
if page < 1 {
return errors.ExceedsMinimumInt("page", "", 0, true, nil)
}
if reflect.TypeOf(result).Kind() != reflect.Slice { check ❗️
return errors.New("`result` is not a slice")
}
offset := (page - 1) * pageSize
db = db.Limit(pageSize).Offset(offset)
if err := db.Find(result).Error; err != nil {
return err
}
return nil
}
用法
var entityList []MyEntity
err := find(&entityList, 10, 1)
您还必须检查输入参数 (result
),因为 db.Find
不适合查找单个支柱 (Retrieving a single object)
If you want to avoid the ErrRecordNotFound error, you could use Find like db.Limit(1).Find(&user), the Find method accepts both struct and slice data
例如(Book
table为空):
b := Book{}
rowsAffectedQuantity := db.Find(&b).RowsAffected // 0
err = db.Find(&b).Error // nil