在db。*中使用游标进行“向后”分页,并使用guido示例为ndb后没有记录的技巧。*

时间:2012-07-06 11:03:02

标签: google-app-engine google-cloud-datastore

后向光标下方的代码是否兼容?

这是一个提前的问题,因为它与* .db和Google App Engine的未记录功能有关 - 可能它与某些文件的cursor()有关! https://developers.google.com/appengine/docs/python/datastore/queryclass?hl=pl#Query_fetch

无论以下哪些文档 ...将来调用相同查询... 都不会给出后向光标功能。我反向查询方向后退。

我正在研究ndb。*的Guido示例,并发现反向游标可以在db。*中实现,并使用ndb中使用的一些技巧。* for cursor.reserve()(+/-)! Backward pagination with cursor is working but missing an item

所以查询是DeleteMe.all()。order('rank')和反向是DeleteMe.all()。order(' - rank')。我假设在排序之前我们可以应用一些过滤器,它仍然会使用相同的索引扫描。

现在代码在db。*中执行真正的向后游标,我想确认是否兼容 - 如果可能的话。

messages = []

class DeleteMe(db.Model):
  rank = db.IntegerProperty()

db.delete(DeleteMe.all(keys_only=True))

for rank in range(50):
  e = DeleteMe(rank = rank)
  e.put()

messages.append('forward +5')     
q = DeleteMe.all().order('rank')
r = q.fetch(5)
for e in r:
  messages.append(e.rank)
endCursor = q.cursor()
messages.append('end to %s' % endCursor)

messages.append('forward +5')
startCursor = endCursor
messages.append('start from %s' % startCursor)     
q = DeleteMe.all().order('rank').with_cursor(startCursor)
r = q.fetch(1)
# 1st trick
backwardCursor = q.cursor()
messages.append('backward cursor %s' % backwardCursor)
q.with_cursor(backwardCursor)
r.extend(q.fetch(5-1))
for e in r:
  messages.append(e.rank)
endCursor = q.cursor()
messages.append('end to %s' % endCursor)

messages.append('backward +5')
startCursor = backwardCursor 
messages.append('modified start from %s' % startCursor)     
# 2st trick
q = DeleteMe.all().order('-rank').with_cursor(startCursor)
r = q.fetch(5)
for e in r:
  messages.append(e.rank)
endCursor = q.cursor()
messages.append('end to %s' % endCursor)

向后工作的结果:

forward +5
0
1
2
3
4
end to E-ABAOsB8gEEcmFua_oBAggE7AGCAhxqCGVyZXN0MjRochALEghEZWxldGVNZRjNnQYMFA==
forward +5
start from E-ABAOsB8gEEcmFua_oBAggE7AGCAhxqCGVyZXN0MjRochALEghEZWxldGVNZRjNnQYMFA==
backward cursor E-ABAOsB8gEEcmFua_oBAggF7AGCAhxqCGVyZXN0MjRochALEghEZWxldGVNZRjOnQYMFA==
5
6
7
8
9
end to E-ABAOsB8gEEcmFua_oBAggJ7AGCAhxqCGVyZXN0MjRochALEghEZWxldGVNZRjSnQYMFA==
backward +5
modified start from E-ABAOsB8gEEcmFua_oBAggF7AGCAhxqCGVyZXN0MjRochALEghEZWxldGVNZRjOnQYMFA==
4
3
2
1
0
end to E-ABAOsB8gEEcmFua_oBAggA7AGCAhxqCGVyZXN0MjRochALEghEZWxldGVNZRjJnQYMFA==

有点长,但应该是。如果这样使用db。*是安全的,请提供一些提示,因为它允许非常快速的分页。

1 个答案:

答案 0 :(得分:1)

我不认为这是你应该怎么做的。当使用向后光标时,您还应该使用反向查询 - 在您的情况下,这意味着顺序(' - rank')。