如何在功能中修改Gorm DB指针



我在GO中写了一个REST API应用程序,该应用程序使用Gorm为ORM。在某些部分进行重构时,我想将一些常见的操作移至外部功能ApplyToDBQuery(query *gorm.DB),该功能将指针用于DB查询并修改它,以便以后可以使用修改的查询。

>

示例用法:

query = shared.DB.Debug()
req.ApplytoDBQuery(query)
if query.find(&data).Error != nil {...}
func (this *MyCustomRequest) ApplyToDBQuery(query *gorm.DB) {
    query.Limit(...)
    query.Offset(...)
    query.Where(...)
}

我想,由于我将指针传递到该功能,因此应该修改原始查询,但原始查询实际上没有发生任何事情。

我还尝试将指针传递给指针ApplyToDBQuery(query **gorm.DB),返回修改后的指针ApplyToDBQuery(query *gorm.DB) *gorm.DB,并且由于缺乏想法,即使是这两个组合的组合-ApplyToDBQuery(query **gorm.DB) *gorm.DB

gorm对象在每个操作中克隆本身,因此永远不会更改原始尖头值。

您应该返回最新版本的gorm.db:

return query.Limit(...).Offset(...).Where(...)

将方法接收器更改为

func (this *MyCustomRequest) ApplyToDBQuery(query *gorm.DB) *gorm.DB {
    return query.Limit(...).
        Offset(...).
        Where(...)
}

然后将其用作:

query = req.ApplytoDBQuery(query)
if query.find(&data).Error != nil {...}

原因已经由 @r3v4n

指向

您应该使用前两个答案,但是,如果出于某种原因,您必须对指针中传递的更改 apply ,您仍然可以"手动"做。

query = shared.DB.Debug()
req.ApplytoDBQuery(query)
if query.find(&data).Error != nil {...}
func (r *MyCustomRequest) ApplyToDBQuery(query *gorm.DB) {
    q := query.Limit(...).Offset(...).Where(...)
    *query = *q
}

作为旁注,通常不鼓励使用接收器名称(例如thisself),而是首选的方法是使用简短的方法,例如1至3个字母,缩写类型的名称。

例如:

func (r *Request) AddCookie(c *Cookie)
func (c *Client) Get(url string) (resp *Response, err error)
func (srv *Server) ListenAndServe() error

补充 @r3v4n答案:

  1. 使用链接
  2. 使用db.Scopes进行代码重新使用而不是通常的func调用。

可以这样:

query = shared.DB.Debug()
if query.Scopes(req.ApplyToDBQuery).find(&data).Error != nil {
  // handle error
}
func (this *MyCustomRequest) ApplyToDBQuery(query *gorm.DB) *gorm.DB {
    return query.Where(...).Limit(...).Offset(...)
}

最新更新