文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Gorm:如何在字段中存储结构

2024-02-06 07:59

关注

问题内容

我试图将 *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
}


正确答案


对于自定义数据类型,您需要指定如何在数据库中存储和检索该值。这是通过实现 scannervaluer 接口来完成的。

但是,由于 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

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 资料下载
  • 历年真题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯