GAE db index 新發現 -- 可以有兩個以上的 order
今天在實作中發現,GAE 的 db 有個規則
如果在 query 當中用到了不等式,例如:我希望限制 status 欄位的值不要是 'A'
那麼後面第一個接的 order 欄位(如果要指定排序)就要是 status,不然會報錯
這應該跟 GAE db 的實作有關
錯誤原文:
BadArgumentError: First ordering property must be the same as inequality filter property, if specified for this query; received build_time, expected status
再來,我發現GAE db query 其實可以用兩以上個欄位去 order
如果在 query 當中用到了不等式,例如:我希望限制 status 欄位的值不要是 'A'
那麼後面第一個接的 order 欄位(如果要指定排序)就要是 status,不然會報錯
這應該跟 GAE db 的實作有關
錯誤原文:
BadArgumentError: First ordering property must be the same as inequality filter property, if specified for this query; received build_time, expected status
再來,我發現GAE db query 其實可以用兩以上個欄位去 order
例如我可以下這樣一連串的 query
query.filter("uid =", uid)
query.filter("payment_confirm_status =", payment_confirm_status)
query.filter("status !=", "credit_card-unpaid")
query.order("status")
query.order("-access_time")
可以看到 order 的欄位有兩個,但這樣也是可以的
只要新增下列index.yaml 項目就行
- kind: PaidOrder
properties:
- name: payment_confirm_status
- name: uid
- name: status
- name: access_time
direction: desc
同樣的原理,再看一個例子:
query.filter("vid =", vid)
query.filter("payment_confirm_status =", payment_confirm_status)
query.filter("status !=", "credit_card-unpaid")
query.order("status")
query.order('build_time')
只要新增下列 index.yaml 項目
- kind: PaidOrder
properties:
- name: payment_confirm_status
- name: vid
- name: status
- name: build_time
上述例子經過測試無誤
留言
張貼留言