Maison >développement back-end >Golang >Gorm : Comment stocker des structures dans des champs
J'ai essayé de sauvegarder l'identifiant du contrat hederea de type *hedera.contractid dans le champ gorm mais j'ai obtenu l'erreur " Trouvé pour la structure github.com/hashgraph/hedera-sdk-go/v2 Champ invalide. aliaskey pour accountid : définissez une clé étrangère valide pour la relation ou implémentez l'interface d'évaluation ”
Contrat d'emballage
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 }
modèle 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 }
Pour un type de données personnalisé, vous devez spécifier comment stocker et récupérer la valeur dans la base de données. Cela se fait en implémentant l'interface scanner
和 valuer
.
Cependant, grâce à hedera.contractid
是在另一个包中定义的,因此您需要创建自己的 contractid
et à la mise en œuvre de ces interfaces. Des choses comme ça :
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) }
De plus, il sera hedera.contractid
转换为 model.contractid
partout où il sera utilisé. Par exemple :
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), })
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!