を取得するために(降順索引を使用)エンティティを照会するためにインデックスを使用します私はをテストしていないそれinどのような形、形または形であってもよい。構文が正しくない場合もあります。
原則は、memcacheが失敗した場合にデータストアを使用してフォールバックを提供するためにmemcacheを使用して単調なシーケンスを生成することです。
class IndexEndPoint(db.Model):
index = db.IntegerProperty (indexed = False, default = 0)
def find_next_index (cls):
""" finds the next free index for an entity type """
name = 'seqindex-%s' % (cls.kind())
def _from_ds():
"""A very naive way to find the next free key.
We just take the last known end point and loop untill its free.
"""
tmp_index = IndexEndPoint.get_or_insert (name).index
index = None
while index is None:
key = db.key.from_path (cls.kind(), tmp_index))
free = db.get(key) is None
if free:
index = tmp_index
tmp_index += 1
return index
index = None
while index is None:
index = memcache.incr (index_name)
if index is None: # Our index might have been evicted
index = _from_ds()
if memcache.add (index_name, index): # if false someone beat us to it
index = None
# ToDo:
# Use a named task to update IndexEndPoint so if the memcache index gets evicted
# we don't have too many items to cycle over to find the end point again.
return index
def make_new (cls):
""" Makes a new entity with an incrementing ID """
result = None
while result is None:
index = find_next_index (cls)
def txn():
"""Makes a new entity if index is free.
This should only fail if we had a memcache miss
(does not have to be on this instance).
"""
key = db.key.from_path (cls.kind(), index)
if db.get (key) is not None:
return
result = cls (key)
result.put()
return result
result = db.run_in_transaction (txn)
あなたはニック・ジョンソンの[答え]をチェックすることもできます(http://stackoverflow.com/questions/3985812/how-to-implement google-appengine-on-google-appengine)を使用します。 –
http:// stackoverflowを参照してください。com/questions/3985812/how-to-implement-autoincrement-on-google-appengine – max
数字が単調増加して増加する必要があるのはなぜですか? –