我正在开发一个 Golang 应用程序,我需要从表中获取最后一条记录。我有下面提到的型号:
type SQLTransaction struct {
Id int `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
Version uint64 `protobuf:"varint,1,opt,name=version,proto3" json:"version,omitempty" gorm:"primaryKey"`
Hash string `protobuf:"bytes,3,opt,name=hash,proto3" json:"hash,omitempty"`
VmStatusId int `protobuf:"bytes,6,opt,name=vm_status_id,proto3" json:"vm_status_id,omitempty"`
}
这是我的 gorm 函数,我想在其中获取最后一条记录
func (mgr *manager) GetLastTxn() (int, error) {
var versionId int
resp := mgr.connection.Table("transactions").Last("", "version")
return versionId, resp.Error
}
错误:
model value required
[0.053ms] [rows:0] SELECT * FROM `transactions` WHERE version ORDER BY `transactions`. DESC LIMIT 1
0 model value required
我怎样才能实现它?
您的示例中有几个问题需要处理。
首先,错误
model value required
表明Last
方法需要一个模型来存储结果。如果您想要包含所有数据的整个记录,您可以这样做:
var lastVersion SQLTransaction
resp := mgr.connection.Table("transactions").Last(&lastVersion)
如果您只想要记录的 ID,请执行以下操作:
var lastVersion struct {
ID int
}
resp := mgr.connection.Table("transactions").Last(&lastVersion)
接下来,您不需要
Last("", "version")
,因为它不会做您认为它会做的事情。第一个参数是指向结果对象的指针(对于所有 go-gorm
方法来说,它始终应该是一个对象或一个切片)。第二个是 WHERE 子句的条件。因此,如果您不需要额外的 WHERE 子句,正确的语法是:
resp := mgr.connection.Table("transactions").Last(&lastVersion)
如果你看一下 Last
方法的
code,它在执行该方法时会考虑主键,因此你甚至不需要任何额外的参数或条件。