如何在函数中修改 GORM DB 指针?

How to modify GORM DB pointer in function?

我有一个用 Go 编写的 REST API 应用程序,它使用 GORM 作为 ORM。在重构某些部分的过程中,我想将一些常用操作移动到一个外部函数ApplyToDBQuery(query *gorm.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 对象为每个操作克隆自身,因此原始指向的值永远不会改变。

你应该return最新版本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已经指出

您应该遵循前两个答案的建议,但是,如果出于某种原因,您必须应用 对传入指针的更改,您仍然可以这样做"manually".

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(...)
}