التطبيق المحرك مخزن البيانات في المشغل - كيفية استخدام؟

StackOverflow https://stackoverflow.com/questions/1003247

سؤال

والقراءة: http://code.google.com/appengine /docs/python/datastore/gqlreference.html

وأريد أن استخدم:

و: = IN

ولكن أنا متأكد من كيفية العمل على انجاحه. دعونا نفترض ما يلي

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')

وكيف يمكنني أن أفعل استعلام الذي يحصل لي قائمة من العناصر المحفوظة لمستخدم؟ من الواضح يمكنني القيام به:

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

ولكن هذا يحصل لي قائمة من المفاتيح. وأود أن أغتنم الآن تلك القائمة وسهولة الحصول عليها إلى استعلام للحصول على مجال شارع من UniqueListOfSavedItems. أعتقد أنه كان يمكن القيام به:

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

ولكن شيئا ما ليس صحيحا ... أي أفكار؟ هو (أنا في بلدي يوم عمل، لذلك لا يمكن اختبار هذا الآن):

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

ملاحظة جانبية: ما مشكلة صعبة شيطاني للبحث عن ذلك لأن جميع أهتم بأمرهم هي المشغل "IN"

.
هل كانت مفيدة؟

المحلول

ومنذ لديك قائمة من المفاتيح، لا تحتاج للقيام الاستعلام الثاني - يمكنك القيام به دفعة جلب، بدلا من ذلك. جرب هذا:

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

و(لاحظ أنك لا تحتاج حتى شرط حارس - وdb.get على 0 الكيانات غير تماس في appropritely).

ما هو الفرق، قد تسأل؟ حسنا، يأخذ db.get حول 20-40ms. استعلام، من ناحية أخرى (GQL أو لا) يستغرق حوالي 160-200ms. ولكن مهلا، فإنه يحصل أسوأ! ويتم تنفيذ المشغل في بيثون، ويترجم إلى استعلامات متعددة، والتي يتم تنفيذها بشكل متسلسل. حتى إذا كنت تفعل الاستعلام مع فلتر لمدة 10 مفاتيح، تفعلونه 10 عمليات الاستعلام منفصلة 160ms العش، أي ما مجموعه حوالي 1.6 ثواني الكمون. A db.get احد، في المقابل، سوف يكون له نفس التأثير واتخاذ ما مجموعه حوالي 30ms.

نصائح أخرى

و+1 لآدم للحصول لي على الطريق الصحيح. واستنادا إلى مؤشر له، والقيام ببعض البحث في مدونة البحث، لدي الحل التالي.

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)
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top