Search code examples
pythongoogle-cloud-datastorepython-3.7

How does allocateIds() work in Cloud Datastore Mode?


In the new Datastore Mode documentation, there is mention of allocateIds() method. However, beyond a single paragraph, there isn't an example code that illustrates how this method is used.

I am trying to allocate an ID each time I create a new entity so that I can save the ID as a property of the entity itself.

I assume that in pseudocode, it works like this:

    user_id = allocateIds(number_id_ids=1)
    user_key = datastore_client.key(kind='User', user_id)
    user = datastore.Entity(key=user_key)
    user.update({ 'user_id': user_id })  # Allows a get_user_by_id() query
    datastore_client.put(user)

How exactly does allocateIds() work in practice?


Solution

  • Yes, allocateIds() should work for the case where you want to get an ID from Datastore mode and use it as both an ID and property value:

    from google.cloud import datastore
    
    client = datastore.Client()
    
    # Allocate a single ID in kind User
    # Returns list of keys
    keys = client.allocate_ids(client.key('User'), 1)
    
    # Get key from list
    key = keys[0]
    print(key.id)
    
    # Create a User entity using our key
    user = datastore.Entity(key)
    
    # Add ID as a field
    user.update({
        'user_id': key.id
    })
    
    # Commit to database
    client.put(user)
    
    # Query based on full key
    
    query = client.query(kind='User')
    query.key_filter(user.key, '=')
    
    results = list(query.fetch())
    print(results)
    

    For most other cases where you just want a single auto-ID, you can skip allocate_ids:

    # Create a User entity
    # Use an incomplete key so Datastore assigns an ID
    user = datastore.Entity(client.key('User'))
    
    # Add some data
    user.update({
        'foo': 'bar'
    })
    
    # Datastore allocates an ID when you call client.put
    client.put(user)
    
    # user.key now contains an ID
    user_id = user.key.id
    print(user_id)
    
    # Query with the ID and key
    
    query = client.query(kind='User')
    query.key_filter(user.key, '=')
    
    results = list(query.fetch())
    print(results)