GAE Index Problem

by Yan Sheng

目的

GAE应用中, 如果有定义数据库models, 并且有查询语句的话, 会使用到Index.yaml中的相关设置. 她主要用于告诉GAE, 这个应用中的所有查询语句(Gql, filter等)中使用到哪些数据表, 哪些字段, 按照什么排序. 这样做主要是为了"allow speedy access to the data in your datastore", 也就是加快访问数据库的速度. 这可能是由于google的"数据库"有点特别...

示例

index.yaml的内容一般类似于:

indexes:
- kind: Person
  properties:
  - name: last_name
  - name: height
    direction: desc

这个表示说, 程序中有一个查询是对Person这个表进行, 查询中用到字段last_name, height, 然后结果按照height的逆序返回.

而在appengine管理后台, 对于每个应用的Data Store Indexes中描述的, 如下图, 就是和index.yaml一致的.

如何生成

一般, 这个index.yaml头部有个"#AUTOGENERATED", 表示自动生成, 也就是说程序运行时, 根据查询代码自动更新. 在本地开发时, 运行dev_appserver.py, 一般都会生成. 当然也可以将自动生成去掉, 这样我们可以手工定义. 更多的信息可见 这里

遇到的问题

今天在调试中出现两个问题:

1, 出错信息1, 这是我在使用order("-date")时出现的错误, 说是排序属性需和过滤属性一致. 也就是filter时是category的话, 排序时也得按照category排序. 而不能直接像django中orm的filter(xxx).order(yyy). xxx和yyy得是同一个字段.

BadArgumentError: First ordering property must be the same as inequality filter property, if specified for this query; received date, expected category

但我看 文档 上, 有类似filter(xxx).order(yyy)的例子, 奇怪的是, 到我这边写了, 总是报这个错误, 无奈我只能把所有order去掉.

2, 出错信息2,

NeedIndexError: no matching index found. This query needs this index: - kind: Photo properties: - name: category - name: category - name: isHome - name: category

这个就相对简单些了, 就是说缺少Index错误, 没有找到匹配的index定义. 也就是说, 程序中的查询没有在index.yaml中找到匹配的. 这个只要增加类似如上的index描述就可以了. 或者直接让他自动生成吧.

ps, 自动生成有个不好的地方就是, 比如一个query,

allphoto = Photo.all() photo1 = allphoto.filter('cateogry = ', 'aaa') photo2 = allphoto.filter('cateogry = ', 'bbb') photo3 = allphoto.filter('cateogry = ', 'ccc')

自动生成会是这样子:

- kind: Photo
  properties:
  - name: cateogry
  - name: cateogry
  - name: cateogry
...

也就是会出现n多重复的东西. 看来还是和django的orm不同, 所以最好将每个查询分开来~

GAE