为什么项目 ID 附加到我的 Datastore Key 对象?

Why is project id attached to my Datastore Key object?

由于某些无法解释的原因,我的 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>

对此有何解释?

实体被划分为子集,当前由项目 ID 和命名空间 ID 标识。

更多参考请check google doc and this

我认为问题在于您同时使用了 google.cloud.datastoreNDB 库,并且关键对象不兼容。下面是将数据存储客户端密钥转换为 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)