docs: def save(self, must_create=False):
          """
          Saves the current session data to the database.
  
          :keyword bool must_create: If ``True``, a ``CreateError`` exception
              will be raised if the saving operation doesn't create a *new* entry
              (as opposed to possibly updating an existing entry).
          :raises: ``CreateError`` if ``must_create`` is ``True`` and a session
              with the current session key already exists.
          """
  
          # If the save method is called with must_create equal to True, I'm
          # setting self._session_key equal to None and when
          # self.get_or_create_session_key is called the new
          # session_key will be created.
          if must_create:
              self._session_key = None
  
          self._get_or_create_session_key()
  
          update_kwargs = {
              'Key': {'session_key': self.session_key},
          }
          attribute_names = {'#data': 'data'}
          attribute_values = {
              ':data': self.encode(self._get_session(no_load=must_create))
          }
          set_updates = ['#data = :data']
          if must_create:
              # Set condition to ensure session with same key doesnt exist
              update_kwargs['ConditionExpression'] = \
                  DynamoConditionAttr('session_key').not_exists()
              attribute_values[':created'] = int(time.time())
              set_updates.append('created = :created')
          update_kwargs['UpdateExpression'] = 'SET ' + ','.join(set_updates)
          update_kwargs['ExpressionAttributeValues'] = attribute_values
          update_kwargs['ExpressionAttributeNames'] = attribute_names
          try:
              self.table.update_item(**update_kwargs)
          except ClientError as e:
              error_code = e.response['Error']['Code']
              if error_code == 'ConditionalCheckFailedException':
                  raise CreateError
              raise