Maison  >  Article  >  développement back-end  >  ## Pourquoi ne puis-je pas récupérer des entités de Go Datastore avec des tranches imbriquées ?

## Pourquoi ne puis-je pas récupérer des entités de Go Datastore avec des tranches imbriquées ?

Barbara Streisand
Barbara Streisandoriginal
2024-10-27 10:06:30563parcourir

## Why Can't I Retrieve Entities from Go Datastore with Nested Slices?

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 :

  1. Éviter Go pour l'interaction avec la banque de données : Abandonner l'utilisation de Go pour l'interaction avec la banque de données et continuer avec Python.
  2. Désérialiseur personnalisé : Développez votre propre désérialiseur de banque de données personnalisé capable de gérer des tranches de tranches imbriquées. Cependant, cette approche est complexe et peut nécessiter des efforts importants.
  3. Redéfinissez les structures de données : Modifiez vos structures de données Python pour respecter les limitations de Go. Cela implique de supprimer les tranches imbriquées de ModelA ou ModelB et de restructurer vos données en conséquence.

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)), &amp;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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn