亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用切片的動態結構(包含外鍵)和 go-gorm 將數據插入數據庫

使用切片的動態結構(包含外鍵)和 go-gorm 將數據插入數據庫

Go
狐的傳說 2022-06-06 17:53:39
我有一個從Ompluscator創建的動態結構,它包含一個帶有外鍵引用的嵌套結構(結構切片)。成功創建父 ( User Table) 和子 ( ) 表。Credit Card即使插入用戶表也是成功的,但后來field value not valid在處理credit_card表條目時會出錯。這是完整的代碼:creditCardStruct := dynamicstruct.NewStruct().    AddField("Bank", "", `protobuf:"bytes,1,opt,name=number,proto3" json:"bank,omitempty" gorm:"column:bank;not null"`).    AddField("Number", "", `protobuf:"bytes,1,opt,name=number,proto3" json:"number,omitempty" gorm:"column:number;not null;size:16;primary_key"`).    AddField("Cvv", "", `protobuf:"bytes,2,opt,name=cvv,proto3" json:"cvv,omitempty" gorm:"column:cvv;not null;size:5" skyflow:"only4digits"`).    //AddField("Expiry", timeNow, `protobuf:"bytes,3,opt,name=expiry,proto3" json:"expiry,omitempty" gorm:"column:expiry;type:timestamp;not null;"`).    AddField("Name", "", `protobuf:"bytes,1,opt,name=number,proto3" json:"name,omitempty" gorm:"column:name;not null"`).    AddField("ProfileID", "", `protobuf:"bytes,5,opt,name=userName,proto3" json:"profile_id,omitempty" sql:"type:string REFERENCES user_normalized1(profile_id)" gorm:"column:profile_id;not null;primary_key"`).    Build().NewSliceOfStructs()userInstance := dynamicstruct.NewStruct().    AddField("ProfileID", "", `protobuf:"bytes,1,opt,name=number,proto3" json:"profile_id,omitempty" gorm:"column:profile_id;unique;not null;unique_index;primary_key"`).    AddField("CreditCards", creditCardStruct, `protobuf:"bytes,1,opt,name=number,proto3" json:"credit_cards,omitempty" gorm:"foreignkey:ProfileID;association_foreignkey:ProfileID"`).    Build().    New()db.Table("user_normalized1").AutoMigrate(userInstance)db.Table("credit_card1").AutoMigrate(creditCardStruct)data := []byte(`            {            "profile_id":"123",            "first_name": "fname",            "last_name": "lname",            "some_text": "dummy"            ,"credit_cards": [{"bank":"bank1", "cvv":"123", "name":"fname", "number":"nlabla1"},{"bank":"bank2", "cvv":"1234", "name":"lname", "number":"nlabla2"}]            }            `)
查看完整描述

1 回答

?
胡說叔叔

TA貢獻1804條經驗 獲得超8個贊

我找不到有關如何實現它的任何信息。經過大量調試后,我能夠讓它工作,所以發布我的解決方案。


簡短的回答:


嵌套切片必須是指針數組


以這種方式定義您的嵌套/子結構


 creditCardStruct := dynamicstruct.NewStruct().

        AddField("Bank", "", `protobuf:"bytes,1,opt,name=number,proto3" json:"bank,omitempty" gorm:"column:bank;not null"`).

        AddField("Number", "", `protobuf:"bytes,1,opt,name=number,proto3" json:"number,omitempty" gorm:"column:number;not null;size:16;primary_key"`).

        AddField("Cvv", "", `protobuf:"bytes,2,opt,name=cvv,proto3" json:"cvv,omitempty" gorm:"column:cvv;not null;size:5" skyflow:"only4digits"`).

        //AddField("Expiry", timeNow, `protobuf:"bytes,3,opt,name=expiry,proto3" json:"expiry,omitempty" gorm:"column:expiry;type:timestamp;not null;"`).

        AddField("Name", "", `protobuf:"bytes,1,opt,name=number,proto3" json:"name,omitempty" gorm:"column:name;not null"`).

        AddField("ProfileID", "", `protobuf:"bytes,5,opt,name=userName,proto3" json:"profile_id,omitempty" sql:"type:string REFERENCES user_normalized1(profile_id)" gorm:"column:profile_id;not null;primary_key"`).

        Build().New()


 creditCardArrayInstance := reflect.New(reflect.SliceOf(reflect.TypeOf(creditCardStruct))).Elem().Interface()


 userInstance := dynamicstruct.NewStruct().

    AddField("ProfileID", "", `protobuf:"bytes,1,opt,name=number,proto3" json:"profile_id,omitempty" gorm:"column:profile_id;unique;not null;unique_index;primary_key"`).

    AddField("CreditCards", creditCardArrayInstance, `protobuf:"bytes,1,opt,name=number,proto3" json:"credit_cards,omitempty" gorm:"foreignkey:ProfileID;association_foreignkey:ProfileID"`).

    Build().

    New()


db.Table("user_normalized1").AutoMigrate(userInstance)

db.Table("credit_card1").AutoMigrate(creditCardStruct)

長答案:

  1. 當 DynamicStruct 創建一個Slice of Struct時,它正在創建一個 slice 的指針 reflect.New(reflect.SliceOf(ds.definition)).Interface()。這實際上是一個指向切片的指針。因此,而不是[]*CreditCardsThis 成為*[]*CreditCards

  2. 當 gorm 執行回調以保存關聯時,它有一個單獨的塊用于處理切片,標識的運行時類型不是切片(它是指針)。所以它假設它是結構體并繼續將它作為一個簡單的結構體來處理。

  3. 但是,當 gorm從 scope 構建字段時,對于非結構字段(如切片),它不會設置字段定義。因此,當 gorm 將前一個切片作為普通結構處理時,它的字段是 Invalid 類型,因為它從未設置過。

所以解決方案是手動創建動態結構作為指針數組,而不是提供的NewSliceOfStructsAPI。


查看完整回答
反對 回復 2022-06-06
  • 1 回答
  • 0 關注
  • 332 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號