在插入数据之前获取数据存储区密钥

时间:2018-08-10 17:22:33

标签: python database nosql google-cloud-datastore

Cloud Datastore(Entities, Properties, and Keys)允许使用自动生成的数字ID(或输入自定义名称)来标识实体。

我想将实体写入数据存储之前,在某些业务逻辑中使用自动生成的数字ID

from google.cloud import datastore

ds = datastore.Client('my-project-id')

# Use automatically generated numeric ID.
key = ds.key('MyEntity')

# https://googlecloudplatform.github.io/google-cloud-python/latest/datastore/keys.html
my_id = key.id()

# Some business logic requiring unique ID for MyEntity
data = my_business_logic(my_id)

entity = datastore.Entity(key=key)
entity.update(data)
ds.put(entity)

但是,key.id()None,所以我收到Python TypeError:

TypeError: 'NoneType' object is not callable

Key is documented,所以也许我使用了错误的吸气剂?

1 个答案:

答案 0 :(得分:0)

默认情况下,在实体put()进入数据存储区之前,它们没有完整的密钥(带有数字ID)。

对于像您这样的情况,您想在将实体写入数据存储区之前先知道自动生成的数字ID,则可以使用数据存储区客户端的allocate_ids方法,如下所示:

from google.cloud import datastore

ds = datastore.Client('my-project-id')

key = ds.allocate_ids(ds.key('MyEntity'), 1)[0]

my_id = key.id

data = my_business_logic(my_id)

entity = datastore.Entity(key=key)
entity.update(data)
ds.put(entity)

请注意,allocate_ids接受2个参数,incomplete_keynum_ids,因此,即使您只想要一个键,也需要指定它并提取第一个(也是唯一一个)结果列表的成员。