Google AppEngine : 날짜 범위가 올바른 결과를 반환하지 않습니다
-
05-09-2019 - |
문제
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 콘솔의 엔터티를 통해 반복하기 위해 사용하는 코드에 동일한 아이디어가 적용됩니다.