Maison > développement back-end > Golang > le corps du texte

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

Barbara Streisand
Libérer: 2024-10-27 10:06:30
original
571 Les gens l'ont consulté

## 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>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!