Google Appengine: نطاق التاريخ لا يعود النتائج الصحيحة

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

  •  05-09-2019
  •  | 
  •  

سؤال

أنا أحاول البحث عن بعض القيم ضمن نطاق تاريخ لنوع معين، ولكن لا يتم إرجاع المحتوى للتواريخ الموجودة في قاعدة البيانات بواسطة الاستعلام.

هنا هو مستخلص من رمز بيثون:

deltaDays = timedelta(days= 20)
endDate = datetime.date.today()
startDate = endDate - deltaDays

result = db.GqlQuery(
   "SELECT * FROM myData WHERE mytype = :1 AND pubdate >= :2 and pubdate <= :3", type, startDate, endDate
  )

class myData(db.Model):
   mytype = db.StringProperty(required=True)
   value =  db.FloatProperty(required=True)
   pubdate = db.DateTimeProperty(required=True)

تقوم GQL بإرجاع البيانات، ولكن بعض الصفوف التي أتوقعها مفقودة:

 2009-03-18 00:00:00
(missing date in results: 2009-03-20 data exists in database)
 2009-03-23 00:00:00
 2009-03-24 00:00:00
 2009-03-25 00:00:00
 2009-03-26 00:00:00
(missing date in results: 2009-03-27 data exists in database)
 2009-03-30 00:00:00
(missing date in results: 2009-03-31. data exists in database)
 2009-04-01 00:00:00
 2009-04-02 00:00:00
 2009-04-03 00:00:00
 2009-04-06 00:00:00

قمت بتحميل البيانات عبر البرنامج النصي دي Bulkload. أنا فقط أستطيع أن أفكر في الفهارس تالفة أو شيء مماثل. هذا الاستعلام نفسه يستخدم للعمل من أجل جدول آخر لدي. ولكن كان علي استبداله بمحتوى جديد من مصدر آخر، وهذا المحتوى الجديد لا يستجيب للاستعلام بنفس الطريقة. يحتوي الجدول على حوالي 700.000 صفوف إذا كان ذلك يحدث فرقا.

لقد قمت بإجراء مزيد من النملة البحوث يبدو أنه خطأ في Datastore Appengine. لمزيد من المعلومات حول الأخطاء، تحقق من هذا الرابط:http://code.google.com/p/googleappengine/isue/detail؟id=901.

لقد حاولت إسقاط الفهرس وإعادة إنشاءه بدون حظ.

شكرا

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

المحلول

لا شيء يبدو خطأ بالنسبة لي. هل أنت متأكد من أن التواريخ المفقودة لديها أيضا mytype == النوع؟

لقد لاحظت بعض السلوك المضحك مع الفهارس في الماضي. أوصي بكتابة معالج للتكرار من خلال جميع سجلاتك ووضعها فقط () مرة أخرى في قاعدة البيانات. ربما لا يعمل شيء ما مع التحميل السائبة بشكل صحيح.

إليك نوع المعالج الذي أستخدمه للتكرار من خلال جميع الكيانات في فئة نموذجية:

 class PPIterator(BaseRequestHandler):
  def get(self):
    query = Model.gql('ORDER BY __key__')
    last_key_str = self.request.get('last')
    if last_key_str:
      last_key = db.Key(last_key_str)
      query = Model.gql('WHERE __key__ > :1 ORDER BY __key__', last_key)
    entities = query.fetch(11)
    new_last_key_str = None
    if len(entities) == 11:
      new_last_key_str = str(entities[9].key())
    for e in entities:
      e.put()
    if new_last_key_str:
      self.response.out.write(json.write(new_last_key_str))
    else:
      self.response.out.write(json.write('done'))

يمكنك استخدام كل ما تريد التكرار من خلال الكيانات. اعتدت على استخدام جافا سكريبت في نافذة متصفح، ولكن وجدت أن الخنزير عند جعل مئات الآلاف من الطلبات. في هذه الأيام أجدها أكثر ملاءمة لاستخدام برنامج نصي روبي مثل هذا واحد:

require 'net/http'
require 'json'
last=nil
while last != 'done'
  url = 'your_url'
  path = '/your_path'
  path += "?/last=#{last}" if last
  last = Net::HTTP.get(url,path)
  puts last
end

بن

تحديث: الآن أن API عن بعد يعمل وموثوق به، نادرا ما أكتب هذا النوع من المعالج بعد الآن. تنطبق نفس الأفكار على الرمز الذي تستخدمه هناك للتكرار من خلال الكيانات في وحدة التحكم API عن بعد.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top