문제

IM은 특정 유형의 날짜 범위 내에서 일부 값을 검색하려고하지만 데이터베이스에 존재하는 날짜에 대한 내용은 쿼리에 의해 반환되지 않습니다.

파이썬 코드의 추출물은 다음과 같습니다.

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

De Bulkload 스크립트를 통해 데이터를 업로드했습니다. 나는 단지 인덱스가 손상되거나 비슷한 것으로 생각할 수 있습니다. 이 같은 쿼리는 내가 가진 다른 테이블에서 작동하는 데 사용되었습니다. 그러나 나는 그것을 다른 소스의 새로운 컨텐츠로 바꿔야 했고이 새로운 컨텐츠는 같은 방식으로 쿼리에 응답하지 않습니다. 테이블에는 차이가 발생하면 약 700.000 행이 있습니다.

나는 더 많은 연구 개미를 해왔다. 버그에 대한 자세한 내용은이 링크를 확인하십시오.http://code.google.com/p/googleappengine/issues/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'))

엔티티를 통해 반복하려는 모든 것을 사용할 수 있습니다. 브라우저 창에서 JavaScript를 사용했지만 수십만 건의 요청을 할 때 돼지라는 것을 알았습니다. 요즘 나는 이와 같은 루비 스크립트를 사용하는 것이 더 편리하다고 생각합니다.

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