Gorm: Bagaimana untuk menyimpan struct dalam medan

WBOY
Lepaskan: 2024-02-06 08:15:11
ke hadapan
730 orang telah melayarinya

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
}
Salin selepas log masuk

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
}
Salin selepas log masuk


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)
}
Salin selepas log masuk

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),
    })
Salin selepas log masuk

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

sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan