2010-11-17 8 views
5

Mam wątpliwości, w jaki sposób przechowywane są obiekty. Że mam klasę zdefiniowaną jak:W jaki sposób przechowywane są klasy modeli aplikacji Google App Engine?

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

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

Domyślam się, że jedyną rzeczą, przechowywane w magazynie danych jest nazwa/wartość/rodzaj some_number wraz z pełną nazwę klasy (SomeEntity). Jednak nie natknąłem się na żadne informacje, które to potwierdzają.

1) Czy ktoś może to potwierdzić?

Chciałbym potwierdzić, że mogę zmienić (i dodać/usunąć) metody bez wpływu na dane są przechowywane.

2) Co się stanie z istniejącymi obiektami, jeśli dodaję nową właściwość do klasy (a jeśli ta właściwość ma required=true)?

Odpowiedz

10

Podmioty są przechowywane w magazynie danych w reprezentacji protobuf (w tym jej klucz - który zawiera identyfikator aplikacji i rodzaj jednostki). Artykuł o numerze Life of a Datastore Write mówi więcej o reprezentacji encji i sposobie ich zapisywania w magazynie danych. Zapoznaj się z resztą artykułów z tej serii, aby uzyskać bardziej szczegółowe informacje.

1) Metody nie mają wpływu na dane przechowywane w Państwa jednostce, dlatego można je dodawać/usuwać/zmieniać bez wpływu na reprezentację danych.

2) Datastore jest niepotrzebne (w przeciwieństwie do typowej bazy danych SQL). Zmiana twojego Model w ogóle nie ma wpływu na dane w magazynie danych. Po pobraniu istniejącej jednostki, jeśli brakuje jej pola required, zostanie zgłoszony błąd. Ewentualnie, jeśli nie jest to wymagane i podaje się wartość domyślną, w polu brakującym zostanie użyta wartość domyślna.

Jeśli chcesz przenieść stary model do nowego, możesz rozważyć użycie biblioteki appengine-mapreduce do iteracji po wszystkich swoich obiektach i migracji każdej z nich osobno. Przeczytaj więcej o migracji schematu here.

+0

+1 Wielkie dzięki David. To jest dokładnie ta informacja, której potrzebowałem. –

3

Są one przechowywane jako bufory protokołów. Możesz przeczytać o niektórych szczegółach w artykule "How Entities and Indexes are Stored".

Można zobaczyć to, co jest faktycznie przechowywane z:

db.model_to_protobuf(your_entity) 

Jest bezpieczny do dodawania/usuwania metody, po prostu uważać na nadpisanie built-in metod.

Dołącz wartość domyślną, jeśli dodasz właściwość, która jest wymagana. Istniejące jednostki nie będą aktualizowane, dopóki nie zostanie ponownie umieszczony podmiot.

+0

+1 Dziękuję Robert. Wygląda na interesujący artykuł. –