首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Gorm:如何在字段中存储结构

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

Stack Overflow用户
提问于 2022-11-20 17:58:19
回答 1查看 56关注 0票数 0

我正在尝试将*hedera.ContractID类型的hederea合同ID保存到Gorm字段中,但我得到了错误“为struct *hedera.ContractID字段AliasKey:定义关系的有效外键或实现Valuer接口”

包装合同

代码语言:javascript
复制
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模型

代码语言:javascript
复制
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
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-11-20 21:42:29

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

但是,由于hedera.ContractID是在另一个包中定义的,因此需要创建自己的ContractID并实现这些接口。就像这样:

代码语言:javascript
复制
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。例如:

代码语言:javascript
复制
    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),
    })
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74510576

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档