2010-11-17 9 views
5

Je doute de la façon dont les objets sont stockés. Dire que j'ai une classe définie comme:Comment les classes de modèles Google App Engine sont-elles stockées?

class SomeEntity(db.Model): 
    some_number = db.IntegerProperty(required=True) 

    def calculate_something(self): 
     return self.some_number * 2 

Je pense que la seule chose stockée dans la banque de données est le nom/valeur/type de some_number ainsi que le nom complet de la classe (SomeEntity). Cependant, je ne suis pas tombé sur des informations qui le confirme.

1) Quelqu'un peut-il confirmer cela?

Je voudrais confirmer que je peux changer (et ajouter/supprimer) des méthodes sans affecter d'une manière ou d'une autre les données sont stockées.

2) De plus, qu'arrive-t-il aux objets existants si j'ajoute une nouvelle propriété à la classe (et si cette propriété a required=true)?

Répondre

10

Les entités sont stockées dans le magasin de données dans une représentation protobuf (y compris sa clé - qui inclut votre ID d'application et le type de l'entité). L'article Life of a Datastore Write parle davantage de la représentation des entités et de la façon dont elles sont écrites dans le magasin de données. Consultez le reste des articles de cette série pour plus d'informations détaillées.

1) Les méthodes n'ont aucune incidence sur les données stockées avec votre entité, vous pouvez donc les ajouter/les supprimer/les modifier sans affecter la représentation de vos données.

2) Le magasin de données est schemaless (contrairement à la base de données SQL typique). La modification de votre Model n'a aucun impact sur les données du magasin de données. Lorsque vous récupérez une entité existante, s'il manque un champ required, une erreur est générée. Alternativement, si vous ne le faites pas nécessaire et fournissez une valeur par défaut, la valeur par défaut sera utilisée pour le champ manquant.

Si vous devez migrer un ancien modèle vers un nouveau modèle, vous pouvez envisager d'utiliser la bibliothèque appengine-mapreduce pour parcourir toutes vos entités et les migrer individuellement. En savoir plus sur la migration de schéma here.

+0

+1 Merci beaucoup David. C'est exactement l'information dont j'avais besoin. –

3

Ils sont stockés en tant que tampons de protocole. Vous pouvez lire certains des détails dans l'article "How Entities and Indexes are Stored".

Vous pouvez voir ce qui est réellement stocké avec:

db.model_to_protobuf(your_entity) 

Il est sûr d'ajouter/supprimer des méthodes, juste faire attention au sujet des méthodes built-in écraser.

Incluez une valeur par défaut si vous ajoutez une propriété requise. Les entités existantes ne seront pas mises à jour tant que vous n'aurez pas réintégré l'entité.

+0

+1 Merci Robert. On dirait un article intéressant. –