问题内容 我试图将 *hedera.contractid 类型的 hederea 合约 id 保存到 gORM 字段中,但收到错误“为 struct GitHub.com/hashgr
我试图将 *hedera.contractid 类型的 hederea 合约 id 保存到 gORM 字段中,但收到错误“为 struct GitHub.com/hashgraph/hedera-sdk-Go/v2 找到了无效字段。 accountid的字段aliaskey:为关系定义有效的外键或实现valuer接口”
打包合同
import (
"fmt"
"github.com/.../scanner/controllers/blockchain"
database "github.com/.../scanner/db"
model "github.com/.../scanner/models"
"github.com/rs/xid"
"gorm.io/gorm"
)
func deploycontract() *gorm.db {
//connect to database
db, err := database.connecttodb()
//if db connection fails
if err != nil {
panic(err)
}
//init model
var modelcontract model.contract
//check if a contract has been deployed
if err := db.first(&modelcontract); err.error != nil {
//no deployment found
//migrate the schema
db.automigrate(&model.contract{})
//deploy contract
contract, _ := blockchain.deploycontract()
//create record
// generate random id
id := xid.new()
// create
db.create(&model.contract{
id: id.string(),
contractid: contract.receipt.contractid,
gasused: contract.callresult.gasused,
transactionid: fmt.sprint(contract.transactionid),
timestamp: contract.consensustimestamp,
chargefee: fmt.sprint(contract.transactionfee),
payeraccount: fmt.sprint(contract.transactionid.accountid),
status: fmt.sprint(contract.receipt.status),
})
}
return db
}
gorm模型
package models
import (
"time"
"github.com/hashgraph/hedera-sdk-go/v2"
"gorm.io/gorm"
)
type Contract struct {
gorm.Model
Id string
ContractId *hedera.ContractID
GasUsed uint64
TransactionId string
Timestamp time.Time
ChargeFee string
PayerAccount string
Status string
}
对于自定义数据类型,您需要指定如何在数据库中存储和检索该值。这是通过实现 scanner
和 valuer
接口来完成的。
但是,由于 hedera.contractid
是在另一个包中定义的,因此您需要创建自己的 contractid
并实现这些接口。像这样的事情:
type contractid hedera.contractid
type contract struct {
gorm.model
id string
contractid *contractid
gasused uint64
transactionid string
timestamp time.time
chargefee string
payeraccount string
status string
}
func (c *contractid) scan(value interface{}) error {
bytes, ok := value.([]byte)
if !ok {
return errors.new(fmt.sprint("failed to unmarshal contractid value:", value))
}
return JSON.unmarshal(bytes, c)
}
func (c contractid) value() (driver.value, error) {
return json.marshal(c)
}
此外,无论使用什么地方,都将 hedera.contractid
转换为 model.contractid
。例如:
cID := model.ContractID(*contract.Receipt.ContractID)
// Create
db.Create(&model.Contract{
Id: id.String(),
ContractId: &cID,
GasUsed: contract.CallResult.GasUsed,
TransactionId: fmt.Sprint(contract.TransactionID),
Timestamp: contract.ConsensusTimestamp,
ChargeFee: fmt.Sprint(contract.TransactionFee),
PayerAccount: fmt.Sprint(contract.TransactionID.AccountID),
Status: fmt.Sprint(contract.Receipt.Status),
})
以上就是Gorm:如何在字段中存储结构的详细内容,更多请关注编程网其它相关文章!
--结束END--
本文标题: Gorm:如何在字段中存储结构
本文链接: https://lsjlt.com/news/561302.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0