如何获取gorm中的最后一条记录?

问题描述 投票:0回答:1

我正在开发一个 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

我怎样才能实现它?

go go-gorm
1个回答
1
投票

您的示例中有几个问题需要处理。

首先,错误

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
,它在执行该方法时会考虑主键,因此你甚至不需要任何额外的参数或条件。

© www.soinside.com 2019 - 2024. All rights reserved.