如何在函数中修改 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
}
作为旁注,通常不鼓励使用像 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
补充@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(...)
}
我有一个用 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
}
作为旁注,通常不鼓励使用像 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
补充@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(...)
}