目的
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不同, 所以最好将每个查询分开来~