我試圖將*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:如何在欄位中儲存結構的詳細內容。更多資訊請關注PHP中文網其他相關文章!