为什么项目 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.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)
由于某些无法解释的原因,我的 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.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)