0

我试图在特定类型的日期范围内搜索某些值,但查询未返回数据库中存在的日期的内容。

这是python代码的摘录:

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 行。

我做了更多的研究,它似乎是 appEngine DataStore 中的一个错误。有关该错误的更多信息,请查看此链接: http ://code.google.com/p/googleappengine/issues/detail?id=901

我试过删除索引并重新创建它,但没有成功。

谢谢

4

1 回答 1

1

在我看来没有什么不对。您确定缺少的日期也有 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,但在发出数十万个请求时发现那是一头猪。这些天来,我发现使用这样的 ruby​​ 脚本更方便:

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 控制台中的实体的代码。

于 2009-04-06T21:46:37.570 回答