2

後方カーソルからの以下のコードは互換性がありますか?

*.db と Google App Engine の文書化されていない機能に関連しているため、これは事前の質問です。cursor() の文書化に反する可能性があります。 https://developers.google.com/appengine/docs/python/datastore/queryclass?hl=pl#Query_fetch

次のドキュメントが何であれ...同じクエリの将来の呼び出し...後方カーソル機能は提供されません。私は逆方向にクエリを実行しました。

私は ndb.* の Guido の例を研究していて、cursor.reserve() (+/-) のために ndb.* で使用されるいくつかのトリックを使用して、リバース カーソルを db.* に実装できることを発見しました! カーソルを使用した後方ページ付けは機能していますが、アイテムがありません

したがって、クエリは 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 に答える