ndb und Konsistenz: Warum tritt dieses Verhalten in einer Abfrage ohne übergeordnetes Element auf?
Ich arbeite mit Python und ndb und kann nicht verstehen warum. Ich werde die Fälle und den obigen Code posten:
models.pyclass Reference(ndb.Model):
kind = ndb.StringProperty(required=True)
created_at = ndb.DateTimeProperty(auto_now_add=True)
some_id = ndb.StringProperty(indexed=True)
data = ndb.JsonProperty(default={})
Diese Tests werden in der interaktiven Konsole und der Option --high_replication für dev_appserver.py ausgeführt:
Test 1from models import Reference
from google.appengine.ext import ndb
import random
some_id = str(random.randint(1, 100000000000000))
key_id = str(random.randint(1, 100000000000000))
Reference(id=key_id, some_id=some_id, kind='user').put()
print Reference.query(Reference.some_id == some_id, Reference.kind == 'user').get()
# output:
# >> None
Warum ????? Fügen wir nun vor dem Drucken einen Schlaf (1) hinzu:
Test 2from models import Reference
from google.appengine.ext import ndb
import random
from time import sleep
some_id = str(random.randint(1, 100000000000000))
key_id = str(random.randint(1, 100000000000000))
Reference(id=key_id, some_id=some_id, kind='user').put()
sleep(1)
print Reference.query(Reference.some_id == some_id, Reference.kind == 'user').get()
# output:
# >> Reference(key=Key('Reference', '99579233467078'), createdAt=datetime.datetime(2013, 1, 31, 16, 24, 46, 383100), data={}, kind=u'user', some_id=u'25000975872388')
K, nehmen wir an, es emuliert die Zeit für die Verteilung des Dokuments auf alle Google-Tabellen. Ich werde meinen Code niemals in den Ruhezustand versetzen. Jetzt entfernen wir den Schlaf und fügen einen Elternteil hinzu!
Test 3from models import Reference
from google.appengine.ext import ndb
import random
from time import sleep
some_id = str(random.randint(1, 100000000000000))
key_id = str(random.randint(1, 100000000000000))
Reference(id='father', kind='father').put()
Reference(parent=ndb.Key(Reference, 'father'), id=key_id, some_id_id=some_id, kind='user').put()
print Reference.query(Reference.some_id == some_id, Reference.kind == 'user', ancestor=ndb.Key(Reference, 'father')).get()
# output:
# >> Reference(key=Key('Reference', '46174672092602'), createdAt=datetime.datetime(2013, 1, 31, 16, 24, 46, 383100), data={}, kind=u'user', some_id=u'55143106000841')
Das ist verwirrend! Stellen Sie einfach einen Elternteil ein und geben Sie mir starke Übereinstimmung! Warum ? Und wenn dies für eine starke Konsistenz erforderlich ist, warum sollten nicht alle Dokumente beim Einfügen in den Datenspeicher standardmäßig dasselbe übergeordnete Element haben? Vielleicht mache ich es komplett falsch und es gibt einen Weg, es besser zu machen. Bitte, jemand führt mich!
Danke im Voraus