Как работает allocateIds () в режиме облачного хранилища данных? - PullRequest
0 голосов
/ 04 марта 2020

В новой документации режима хранилища данных есть упоминание о allocateIds() методе . Однако, кроме одного абзаца, нет примера кода, который иллюстрирует, как этот метод используется.

Я пытаюсь присвоить идентификатор каждый раз, когда создаю новую сущность, чтобы я мог сохранить идентификатор как свойство самой сущности.

Я предполагаю, что в псевдокоде он работает следующим образом это:

    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)

Как именно allocateIds() работает на практике?

Ответы [ 2 ]

2 голосов
/ 04 марта 2020

Когда вы вызываете функцию allocateIds(), она вызывает новый экземпляр class Key(object), когда вызывается констурктор "Key", она берет все аргументы, которые вы указали allocateIds, и рекомбинирует их с помощью метода _combine_args. Это то, что создает ваш ключ.

(и если вы хотите увидеть код самостоятельно)

источник: https://googleapis.dev/python/datastore/latest/_modules/google/cloud/datastore/key.html#Key

0 голосов
/ 04 марта 2020

Да, allocateIds() должно работать для случая, когда вы хотите получить идентификатор из режима хранилища данных и использовать его как идентификатор и значение свойства:

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)

Для большинства других случаев, когда вы просто Если вам нужен один идентификатор, вы можете пропустить 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)
...