Почему идентификатор проекта привязан к моему объекту Datastore Key? - PullRequest
0 голосов
/ 26 марта 2020

По какой-то необъяснимой причине мой project id прикреплен к Ключу моей User сущности:

<Key('User', 5703358593630208), project=my-project-id>

Это вызывает у меня проблемы, например, когда я пытаюсь использовать этот же ключ как предок другой сущности - я получил бы эту ошибку:

google.cloud.ndb.exceptions.BadValueError: Expected Key instance, got <Key('User', 5703358593630208), project=my-project-id>

Я создал User сущность, подобную этой:

from google.cloud import datastore
datastore_client = datastore.Client()

def save_user(name):
    key = datastore_client.key('User')
    user = datastore.Entity(key=key)
    user.update({
        'name': name,
        'created': datetime.datetime.utcnow()
    })
    datastore_client.put(user)

Дополнительный пример: выполнение наследственного запроса

query = MyEntity.query(ancestor=user_key)

TypeError: ancestor must be a Key; received <Key('User', 5752652897976320), project=my-project-id>

Чем это можно объяснить?

Ответы [ 2 ]

1 голос
/ 01 апреля 2020

Я считаю, что проблема в том, что вы используете библиотеки google.cloud.datastore и NDB, а ключевые объекты несовместимы. Вот пример преобразования ключа клиента хранилища данных в ключ NDB:

from google.cloud import datastore
from google.cloud import ndb

# Start with a google.cloud.datastore key
datastore_client = datastore.Client()
datastore_key = datastore_client.key('Parent', 'foo', 'User', 1234)


def key_to_ndb_key(key):
    # Use flat_path property to create an ndb_key
    key_path = key.flat_path
    ndb_key = ndb.Key(*key_path)
    return ndb_key


# Convert to a ndb key
ndb_client = ndb.Client()
with ndb_client.context() as context:
    ndb_key = key_to_ndb_key(datastore_key)
    print(ndb_key)
0 голосов
/ 28 марта 2020

Объекты разделены на подмножества, в настоящее время идентифицируются по идентификатору проекта и идентификатору пространства имен.

для получения дополнительной информации, пожалуйста, проверьте Google Do c и this .

...