Rumah > Artikel > pembangunan bahagian belakang > Gorm: Bagaimana untuk menyimpan struct dalam medan
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 }
Untuk jenis data tersuai, anda perlu menentukan cara menyimpan dan mendapatkan semula nilai dalam pangkalan data. Ini dilakukan dengan melaksanakan antara muka scanner
和 valuer
.
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!