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

时间:2017-09-07 23:32:09

标签: go go-gorm

我有一个用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 < / p>

4 个答案:

答案 0 :(得分:1)

Gorm对象克隆本身用于每个操作,因此原始的指向值永远不会改变。

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

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

答案 1 :(得分:1)

将方法接收器更改为

u => nameList == null || nameList.Contains(u.Name)

然后将其用作:

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

@ R3v4n已经指出了原因

答案 2 :(得分:1)

你应该使用前两个答案推荐的内容,但是,如果由于某种原因,你必须对传入的指针应用更改,你仍然可以这样做&#34;手动&# 34。

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

答案 3 :(得分:0)

补充@ R3v4n回答:

  1. 使用链接
  2. 使用db.Scopes进行代码重用,而不是通常的func调用。
  3. 可以是这样的:

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