2

来自后向光标的代码是否兼容?

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

无论以下文档...将来调用同一查询...不会提供向后游标功能。我被倒转的查询方向向后退。

我正在研究 ndb.* 的 Guido 示例,发现可以在 db.* 中实现反向游标,并使用 ndb.* 中用于 cursor.reserve() (+/-) 的一些技巧! 带有光标的向后分页正在工作但缺少一个项目

所以查询是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.* 是安全的,请给出一些提示,因为它允许非常快速的分页。

4

1 回答 1

1

我不认为这是你应该这样做的。使用反向游标时,您还应该使用反向查询——在您的情况下,这意味着 order('-rank')。

于 2012-07-06T15:52:16.833 回答