Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Gorm: Bagaimana untuk menyimpan struct dalam medan

Gorm: Bagaimana untuk menyimpan struct dalam medan

WBOY
WBOYke hadapan
2024-02-06 08:15:11734semak imbas

Gorm: Bagaimana untuk menyimpan struct dalam medan

Kandungan soalan

Saya cuba menyimpan id kontrak hederea jenis *hedera.contractid ke dalam medan gorm tetapi mendapat ralat " Ditemui untuk struct github.com/hashgraph/hedera-sdk-go/v2 Medan tidak sah. aliaskey untuk accountid: Tentukan kunci asing yang sah untuk perhubungan atau laksanakan antara muka penilai

Kontrak Pembungkusan

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
}

model 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
}

Jawapan betul


Untuk jenis data tersuai, anda perlu menentukan cara menyimpan dan mendapatkan semula nilai dalam pangkalan data. Ini dilakukan dengan melaksanakan antara muka scannervaluer.

Walau bagaimanapun, terima kasih kepada hedera.contractid 是在另一个包中定义的,因此您需要创建自己的 contractid dan melaksanakan antara muka ini. Perkara seperti ini:

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)
}

Juga, ia akan hedera.contractid 转换为 model.contractid di mana sahaja ia digunakan. Contohnya:

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),
    })

Atas ialah kandungan terperinci Gorm: Bagaimana untuk menyimpan struct dalam medan. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam