In the Google App Engine, how do I avoid creating duplicate objects with the same attribute?

I am trying to add a transaction so as not to create two objects with the same attribute. In my application, I create a new Player every time I see a new Google user. My current implementation sometimes creates duplicate players when several json calls are made by a new Google user within a few milliseconds. When I add a transaction, such as commented out here, I get various errors. What is the easiest way to ensure that I never create two players with the same user_id?

  def get_player_from_user(self, user_id):
    player = Player.all().filter('user_id =', user_id).get()    
    if not player:
        #This can result in duplicate players with the same user_id being created. 
        player = self.create_new_player(user_id)
        #This is what I'm trying to do. 
        #player = db.run_in_transaction(self.create_new_player, user_id=user_id)
    return player

  def create_new_player(self,user_id):
        #Check one more time for an existing user_id match.  
        player = Player.all().filter('user_id =', user_id).get()
        if player:
           return player

        player = Player()
        player.user_id = user.user_id()
        player.put()
        return player
+3
source share
2 answers

( ) get_or_insert . Sahid , .

+4

, get_by_key_name , .

 def create_new_player(self,user_id):
    key_name = "player/%s" % user_id
    player = Player.get_by_key_name (key_name)
    if player is None:
      player = Player (key_name=key_name, user_id=user_id)
      player.put ()
    return player

, , :

    def create_new_player(self,user_id):
      key_name = "player/%s" % user_id
      player = Player.get_or_insert (key_name=key_name, user_id=user_id)
      return player
+1

Source: https://habr.com/ru/post/1763306/


All Articles