Frage

Lesen: http://code.google.com/appengine /docs/python/datastore/gqlreference.html

Ich möchte verwenden:

: = IN

, aber ich bin nicht sicher, wie es funktioniert. Nehmen wir an, das folgende

class User(db.Model):
    name = db.StringProperty()

class UniqueListOfSavedItems(db.Model):
    str = db.StringPropery()
    datesaved = db.DateTimeProperty()

class UserListOfSavedItems(db.Model):
    name = db.ReferenceProperty(User, collection='user')
    str = db.ReferenceProperty(UniqueListOfSavedItems, collection='itemlist')

Wie kann ich eine Abfrage tun, die mir die Liste der gespeicherten Elemente für einen Benutzer erhält? Natürlich kann ich tun:

q = db.Gql("SELECT * FROM UserListOfSavedItems WHERE name :=", user[0].name)

aber das wird mir eine Liste von Schlüsseln. Ich möchte jetzt diese Liste nehmen und es in eine Abfrage zu erhalten, um das str Feld aus UniqueListOfSavedItems zu bekommen. Ich dachte, ich könnte tun:

q2 = db.Gql("SELECT * FROM UniqueListOfSavedItems WHERE := str in q")

aber etwas nicht stimmt ... irgendwelche Ideen? Ist es (sind an meinem Job, so kann dies jetzt nicht testen):

q2 = db.Gql("SELECT * FROM UniqueListOfSavedItems __key__ := str in q)

side note: was für ein teuflisch schwieriges Problem auf suchen, weil alles wirklich ich interessiere der Operator „IN“ ist

.
War es hilfreich?

Lösung

Da Sie eine Liste von Schlüsseln haben, brauchen Sie nicht eine zweite Abfrage zu tun - Sie können eine Charge tun holen, statt. Versuchen Sie folgendes:

#and this should get me the items that a user saved
useritems = db.get(saveditemkeys)

(Beachten Sie brauchen nicht einmal die Schutzklausel - ein db.get auf 0 Einheiten kurzgeschlossen appropritely.)

Was ist der Unterschied, könnten Sie fragen? Nun, ein db.get dauert etwa 20-40ms. Eine Abfrage, auf der anderen Seite (GQL oder nicht) dauert etwa 160-200ms. Aber warten Sie, es wird noch schlimmer! Der IN-Operator wird in Python implementiert, und übersetzt, um mehrere Abfragen, die seriell ausgeführt werden. Also, wenn Sie für 10 Tasten eine Abfrage mit einem IN-Filter tun, tun Sie 10 separate 160ms-ish Abfrageoperationen, für insgesamt etwa 1,6 Sekunden Latenz. Ein einzelner db.get Im Gegensatz dazu wird die gleiche Wirkung hat und insgesamt etwa 30 ms dauern.

Andere Tipps

1 zu Adam für mich auf dem richtigen Weg zu bekommen. Basierend auf seinen Zeiger, und einige der Suche auf Code Search tun, habe ich die folgende Lösung.

usersaveditems = User.Gql(“Select * from UserListOfSavedItems where user =:1”, userkey)

saveditemkeys = []

for item in usersaveditems:
    #this should create a list of keys (references) to the saved item table
    saveditemkeys.append(item.str())    

if len(usersavedsearches > 0):
    #and this should get me the items that a user saved
    useritems = db.Gql(“SELECT * FROM UniqueListOfSavedItems WHERE __key__ in :1’, saveditemkeys)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top