我正在尝试在功能上播种我的 Postgres 数据库。在我的例子中,SeedSchema() 函数可以采用任何类型的结构。所以我定义了一个接口并为我的结构创建了函数,它将播种。我尝试过使用泛型和不使用泛型。
当我将文件中的任何 json 数组解组为字节数组时,json.Unmarshall 方法更改我的结构的 tempMember 成员。Exp,models.Term 到 map[string]interface{}。我在这个函数之前使用过 unmarshall,但我没有见过这样的情况。
这是我的 SeedSchema() 函数:
func (db *Database) SeedSchema(models ...globals.Seeder[any]) error {
var (
subjects []globals.Seeder[any]
fileByte []byte
err error
// tempMember any
)
if len(models) == 0 {
subjects = seederModelList
} else {
subjects = models
}
for _, model := range subjects {
fileName, tempMember := model.Seed()
fmt.Printf("%+v\n", reflect.TypeOf(tempMember)) //1
if fileByte, err = os.ReadFile("db/seeds/" + fileName); err != nil {
fmt.Println(err)
return err
}
if err = json.Unmarshal(fileByte, &tempMember); err != nil {
fmt.Println(err)
return err
}
fmt.Printf("%+v\n", reflect.TypeOf(tempMember)) //2
}
return nil
}
第一个打印返回 []models.AirportCodes 和第二个 []interface {}。
这是我的界面和模型:
func (AirportCodes) Seed() (string, any) {
return "airport_codes.json", []AirportCodes{}
}
type Seeder[T any] interface {
Seed() (string, T)
// Seed(*gorm.DB) error
TableName() string
}
seederModelList = []globals.Seeder[any]{
m.AirportCodes{},
m.Term{},
}
呼如林
相关分类