问题内容
我试图将 *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:如何在字段中存储结构的详细内容,更多请关注编程网其它相关文章!
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
软考中级精品资料免费领
- 历年真题答案解析
- 备考技巧名师总结
- 高频考点精准押题
- 资料下载
- 历年真题
193.9 KB下载数265
191.63 KB下载数245
143.91 KB下载数1148
183.71 KB下载数642
644.84 KB下载数2756
相关文章
发现更多好内容猜你喜欢
AI推送时光机Gorm:如何在字段中存储结构
后端开发2024-02-06
如何在MySQL中使用存储结构
后端开发2024-04-02
如何在元帅中省略结构的条件字段
后端开发2024-04-05
navicat如何看表结构字段
后端开发2024-04-02
在Python中如何存储字符串
后端开发2023-06-30
如何在 Go 中使用 json.Marshal 外部结构并排除空字段?
后端开发2024-04-04
如何在另一个结构体中使用结构体字段而不将其引用为键
后端开发2024-02-10
如何使查询结果结构与我在 GORM Select 上声明的结构相匹配
后端开发2024-04-05
oracle如何修改表结构字段长度
后端开发2024-04-09
如何寻找结构体中未设置值的字段
后端开发2024-04-04
我如何解组 JSON 数据并将其存储在 Go 中的结构中
后端开发2024-02-11
如何在Mysql中已存在的表中增加字段
后端开发2023-10-24
如何在 slog 记录器中传递结构并自动使用其字段?
后端开发2024-02-06
oracle如何查询存储过程中用到哪些字段
后端开发2024-04-19
golang中如何按照结构体的某个字段排序
后端开发2023-06-30
如何理解C语言数据结构中线性表的链式存储结构
后端开发2023-06-21
Mysql如何通过Adjacency List存储树形结构
后端开发2024-04-02
mysql字段如何判断是否存在
后端开发2024-04-02
mysql如何修改表结构(altertable),多列/多字段
后端开发2022-12-21
如何使用反射包操作结构中的地图字段?
后端开发2024-04-05
咦!没有更多了?去看看其它编程学习网 内容吧