我有一个用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>
答案 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
}
作为旁注,通常不建议使用this
和self
之类的接收者名称,而是首选方法是使用简短的,比方说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回答:
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(...)
}