Maison >développement back-end >Golang >## Pourquoi ne puis-je pas récupérer des entités de Go Datastore avec des tranches imbriquées ?
Erreur de la banque de données Go : tranches de structures imbriquées de tranches
Dans le but d'exploiter Go pour améliorer les performances, vous avez rencontré une erreur lors de la tentative pour récupérer des entités de la banque de données AppEngine définie en Python. Le message d'erreur « banque de données : l'aplatissement des structures imbriquées conduit à une tranche de tranches : champ "Messages" » indique une inadéquation structurelle entre vos modèles de projet Go et Python.
Définitions des modèles Go et compatibilité de la banque de données
Le package Go datastore présente certaines limitations concernant la structure de vos modèles de données. Il ne prend pas en charge les tranches imbriquées dans les tranches, comme le champ « Messages » dans votre définition ModelA. Cela signifie que même si vous pouvez avoir une tranche d'entités ModelB dans ModelA, ModelB lui-même ne peut pas avoir de tranches dans ses propres champs.
Options alternatives pour résoudre l'erreur
Pour résoudre cette erreur, vous disposez de plusieurs options :
Exemple : PropertyLoaderSaver pour la désérialisation personnalisée
Si vous choisissez le désérialiseur personnalisé approche, vous pouvez définir une implémentation d'interface PropertyLoaderSaver pour ModelA afin de gérer la désérialisation du champ "Messages". Voici un exemple :
<code class="go">import ( "appengine_internal/datastore" "code.google.com/p/goprotobuf/proto" pb "appengine_internal/datastore" ) type ModelA struct { DateJoin time.Time `datastore:"date_join,"` Name string `datastore:"name,"` OwnerSalutation string `datastore:"owner_salutation,noindex"` OwnerEmailAddress string `datastore:"owner_email_address,"` LogoURL string `datastore:"logo_url,noindex"` Messages []ModelB `datastore:"-"` } // Load implements the PropertyLoaderSaver interface. func (seller *ModelA) Load(c <-chan datastore.Property) error { f := make(chan datastore.Property, 100) for p := range c { if p.Name == "bm" { var val pb.EntityProto err := proto.Unmarshal([]byte(p.Value.(string)), &val) if err != nil { return err } // TODO: Store the result as a new ModelB instance. } else { f <- p } } close(f) return datastore.LoadStruct(seller, f) }</code>
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!