Maison >développement back-end >Golang >Pourquoi mes requêtes de banque de données Google App Engine ne parviennent-elles pas à récupérer les entités nouvellement ajoutées dans les tests ?

Pourquoi mes requêtes de banque de données Google App Engine ne parviennent-elles pas à récupérer les entités nouvellement ajoutées dans les tests ?

Patricia Arquette
Patricia Arquetteoriginal
2024-12-06 13:20:11696parcourir

Why Do My Google App Engine Datastore Queries Fail to Retrieve Newly Added Entities in Tests?

Google App Engine Datastore - Requêtes persistantes

Dans le contexte des tests, accéder aux données de la banque de données de Google App Engine via des requêtes peut s'avérer difficile. Malgré une fonctionnalité apparemment réussie de l'application, les tests ne parviennent souvent pas à récupérer les données attendues.

L'une des raisons potentielles de cet écart réside dans le retard de cohérence des requêtes de la banque de données. Contrairement aux requêtes ancêtres, la plupart des requêtes nécessitent un certain temps pour refléter les entités nouvellement ajoutées. La ligne « Appliquer toutes les transactions en attente et enregistrer la banque de données » indique que l'infrastructure de test applique les transactions en file d'attente après que l'entité a été ajoutée et interrogée.

Par conséquent, les requêtes exécutées immédiatement après la création de l'entité peuvent ne pas capturer ces transactions. changements en attente. Pour résoudre ce problème, il existe plusieurs options :

  • Introduire un délai : Introduire un court délai (par exemple, 100 ms) entre la création des données et la requête ultérieure pour permettre la cohérence.
  • Utiliser une banque de données fortement cohérente : Activer l'option Option StronglyConsistentDatastore lors de la configuration des tests pour forcer la cohérence immédiate des données.

Voici une version modifiée de votre code de test utilisant l'approche différée :

type Entity struct {
    Value string
}

func TestEntityQuery(t *testing.T) {
    c, err := aetest.NewContext(nil)
    if err != nil {
        t.Fatal(err)
    }
    defer c.Close()

    key := datastore.NewIncompleteKey(c, "Entity", nil)
    key, err = datastore.Put(c, key, &Entity{Value: "test"})
    if err != nil {
        t.Fatal(err)
    }

    // Delay to allow for consistency
    time.Sleep(100 * time.Millisecond)

    q := datastore.NewQuery("Entity").Filter("Value =", "test")
    var entities []Entity
    keys, err := q.GetAll(c, &entities)
    if err != nil {
        t.Fatal(err)
    }
    if len(keys) == 0 {
        t.Error("No keys found in query")
    }
    if len(entities) == 0 {
        t.Error("No entities found in query")
    }
}

En incorporant ces mesures, les tests peuvent reflètent avec précision le comportement des requêtes de la banque de données et garantissent que des entités en double ne sont pas créées par inadvertance.

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