维生素C.net

IronRuby, CLR/DLR, Debugging
posts - 75, comments - 212, trackbacks - 10, articles - 0
  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理

GAE的datastore在index上的bug

Posted on 2008-06-22 02:38 new 维生素C.net() 阅读(131) 评论(2)  编辑 收藏 所属分类: Google App Engine

仿照google的guestbook这个sample写了一个,upload到appengine host上后,访问页面却出错了:

# 221.221.203.253 - - [21/06/2008:10:13:01 -0700] "GET / HTTP/1.1" 500 1908 "http://appengine.google.com/deployment?app_id=vanvc" - #
E 06-21 10:13AM 01.565

Traceback (most recent call last):
  File "/base/python_lib/versions/1/google/appengine/ext/webapp/__init__.py", line 499, in __call__
    handler.get(*groups)
  File "/base/data/home/apps/vanvc/0.6/vanvc.py", line 44, in get
    self.response.out.write(template.render(path, template_values))
  File "/base/python_lib/versions/1/google/appengine/ext/webapp/template.py", line 81, in render
    return t.render(Context(template_dict))
  File "/base/python_lib/versions/1/google/appengine/ext/webapp/template.py", line 121, in wrap_render
    return orig_render(context)
  File "/base/python_lib/versions/1/django/template/__init__.py", line 168, in render
    return self.nodelist.render(context)
  File "/base/python_lib/versions/1/django/template/__init__.py", line 705, in render
    bits.append(self.render_node(node, context))
  File "/base/python_lib/versions/1/django/template/__init__.py", line 718, in render_node
    return(node.render(context))
  File "/base/python_lib/versions/1/django/template/defaulttags.py", line 99, in render
    values = list(values)
  File "/base/python_lib/versions/1/google/appengine/ext/db/__init__.py", line 1247, in __iter__
    return self.run()
  File "/base/python_lib/versions/1/google/appengine/ext/db/__init__.py", line 1558, in run
    query_run = self._proto_query.Run(*self._args, **self._kwds)
  File "/base/python_lib/versions/1/google/appengine/ext/gql/__init__.py", line 441, in Run
    res = bind_results.Get(self.__limit, offset)
  File "/base/python_lib/versions/1/google/appengine/api/datastore.py", line 928, in Get
    return self._Run(limit, offset)._Next(limit)
  File "/base/python_lib/versions/1/google/appengine/api/datastore.py", line 877, in _Run
    str(exc) + '\nThis query needs this index:\n' + yaml)
NeedIndexError: no matching index found
This query needs this index:
- kind: Greeting
  properties:
  - name: date
    direction: desc

从错误log中可以看出是index的问题:google app engine使用叫做datastore的东西来存储数据,这个东东是基于赫赫有名的BigTable的.我写了一个查询:

class MainPage(webapp.RequestHandler):
  def get(self):
    greetings=db.GqlQuery("SELECT * "
                          "FROM Greeting"
                          "ORDER BY date DESC LIMIT 15")
   ..........
   ..........

这个Entity的样子是这样:

class Greeting(db.Model):
  author=db.UserProperty()
  content=db.StringProperty()
  date=db.DateTimeProperty(auto_now_add=True)

查询很简单,就是要按照date字段倒排序,在使用dev_appserver.py来本机调试的时候,当执行到这个查询,会自动生成一个index.yaml文件,这个文件里存储了对哪些表的哪些字段添加什么样的index的配置.但是upload到服务器上后就看到了文章一开始的错误报告.

登陆到管理员后台,查看index一项,报告说status是building,而不是期待的serving.如果这个状态值为building,那么执行查询就会报错的.但是等了2小时后,还是building.

于是把查询去掉了oderby,这下可以正常运行了,感觉不错.但是一到administration console下看到那个讨厌的building的index就想干掉它:

1

我修改了index.yaml然后再update,那么当前这个version下面就不需要任何index了.然后用vacuum_indexes来删除掉不用的索引. GAE知道我不再使用它了,问我是否删除,我选择Y,但是告诉我的却是500. --force再试,强迫删除,错误依旧 :(

愁死...

[Update / Jun 22]
今天中午起床后的第一件事就是检查一下adminstrator console,这个index终于是serving的状态了...

Feedback

#1楼    回复  引用  查看    

2008-06-23 17:02 by 红尘中迷茫      
google app engine的限制太多了,只能select回1000个数据,urllib2也有限制,特别是管理员,管理后台。。你只能用google的帐号用。。。绑定死了

#2楼    回复  引用    

2008-09-03 16:31 by chinabin [未注册用户]
今天折騰了半天,總算寫了個app engine的程序,還不夠人性化,期待改進

标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2008-06-22 22:23 编辑过


相关链接: