How to implement “autoincrement” on Google AppEngine

前端 未结 9 798
面向向阳花
面向向阳花 2020-11-27 16:23

I have to label something in a \"strong monotone increasing\" fashion. Be it Invoice Numbers, shipping label numbers or the like.

  1. A number MUST NOT BE used twi
相关标签:
9条回答
  • 2020-11-27 17:13

    I'm thinking in using the following solution: use CloudSQL (MySQL) to insert the records and assign the sequential ID (maybe with a Task Queue), later (using a Cron Task) move the records from CloudSQL back to the Datastore.

    The entities also can have a UUID, so we can map the entities from the Datastore in CloudSQL, and also have the sequential ID (for legal reasons).

    0 讨论(0)
  • 2020-11-27 17:20

    The gaetk - Google AppEngine Toolkit now comes with a simple library function to get a number in a sequence. It is based on Nick Johnson's transactional approach and can be used quite easily as a foundation for Martin von Löwis' sharding approach:

    >>> from gaeth.sequences import * 
    >>> init_sequence('invoce_number', start=1, end=0xffffffff)
    >>> get_numbers('invoce_number', 2)
    [1, 2]
    

    The functionality is basically implemented like this:

    def _get_numbers_helper(keys, needed):
      results = []
    
      for key in keys:
        seq = db.get(key)
        start = seq.current or seq.start
        end = seq.end
        avail = end - start
        consumed = needed
        if avail <= needed:
          seq.active = False
          consumed = avail
        seq.current = start + consumed
        seq.put()
        results += range(start, start + consumed)
        needed -= consumed
        if needed == 0:
          return results
      raise RuntimeError('Not enough sequence space to allocate %d numbers.' % needed)
    
    def get_numbers(needed):
      query = gaetkSequence.all(keys_only=True).filter('active = ', True)
      return db.run_in_transaction(_get_numbers_helper, query.fetch(5), needed)
    
    0 讨论(0)
  • 2020-11-27 17:21

    Take a look at how the sharded counters are made. It may help you. Also do you really need them to be numeric. If unique is satisfying just use the entity keys.

    0 讨论(0)
提交回复
热议问题