Google app engine 在Python NDB数据存储中基于序列号创建固定宽度ID
我有一个名为UserModel的模型,我知道它永远不会超过10000个实体。我在UserModel中没有任何唯一的东西可以用来创建密钥。因此,我决定使用这种格式的字符串键USRXXXXX 其中XXXXX表示序列计数。e、 g USR00001,USR12345 因此,我选择了以下方法来生成IDGoogle app engine 在Python NDB数据存储中基于序列号创建固定宽度ID,google-app-engine,google-cloud-datastore,app-engine-ndb,Google App Engine,Google Cloud Datastore,App Engine Ndb,我有一个名为UserModel的模型,我知道它永远不会超过10000个实体。我在UserModel中没有任何唯一的东西可以用来创建密钥。因此,我决定使用这种格式的字符串键USRXXXXX 其中XXXXX表示序列计数。e、 g USR00001,USR12345 因此,我选择了以下方法来生成ID def generate_unique_id(): qry = UserModel.query() num = qry.count() + 1 id = 'USR' + '%0.5
def generate_unique_id():
qry = UserModel.query()
num = qry.count() + 1
id = 'USR' + '%0.5d' % num
return id
def create_entity(model, id, **kwargs):
ent = model.get_or_insert(id, **kwargs)
# check if its the newly created record or the existing one
if ent.key.id() != id:
raise InsertError('failed to add new user, please retry the operation)
return True
问题:
get\u或\u insert
不保证您不会有重复项。虽然在这种情况下不太可能有重复的数据,但更可能丢失数据。假设您正在插入两个没有祖先的实体-Model.query().count()
可能需要一些时间来反映第一个实体的创建,从而导致第二个实体与第一个实体具有相同的ID,从而覆盖它(即,您最终得到的第二个实体只有第一个实体的ID)Model.query().count()
是len(Model.query().fetch())
的缩写(尽管有一些优化),因此每次生成ID时都会获取所有实体get\u或\u insert
不保证您不会有重复项。虽然在这种情况下不太可能有重复的数据,但更可能丢失数据。假设您正在插入两个没有祖先的实体-Model.query().count()
可能需要一些时间来反映第一个实体的创建,从而导致第二个实体与第一个实体具有相同的ID,从而覆盖它(即,您最终得到的第二个实体只有第一个实体的ID)Model.query().count()
是len(Model.query().fetch())
的缩写(尽管有一些优化),因此每次生成ID时都会获取所有实体get\u或\u insert
不保证您不会有重复项。虽然在这种情况下不太可能有重复的数据,但更可能丢失数据。假设您正在插入两个没有祖先的实体-Model.query().count()
可能需要一些时间来反映第一个实体的创建,从而导致第二个实体与第一个实体具有相同的ID,从而覆盖它(即,您最终得到的第二个实体只有第一个实体的ID)Model.query().count()
是len(Model.query().fetch())
的缩写(尽管有一些优化),因此每次生成ID时都会获取所有实体get\u或\u insert
不保证您不会有重复项。虽然在这种情况下不太可能有重复的数据,但更可能丢失数据。假设您正在插入两个没有祖先的实体-Model.query().count()
可能需要一些时间来反映第一个实体的创建,从而导致第二个实体与第一个实体具有相同的ID,从而覆盖它(即,您最终得到的第二个实体只有第一个实体的ID)Model.query().count()
是len(Model.query().fetch())
的缩写(尽管有一些优化),因此每次生成ID时都会获取所有实体因为您只需要UserModel实体的唯一键,所以我不太理解为什么需要手动创建键。AppEngine自动生成的ID保证是唯一的 关于你的问题,我们有以下几点:
get\u或\u insert
是强一致的,您执行的查询(qry=UserModel.query()
)也不是。因此,可能会导致覆盖现有实体。有关最终一致性的更多信息,请查看Model.query().count()
时,引擎盖下的数据存储执行Model.query().fetch(keys\u only=True)
,并计算结果数。仅按键查询生成小型数据存储操作,这些操作基于谷歌最新的定价变化,不可计费因为您只需要UserModel实体的唯一键,所以我不太理解为什么需要手动创建键。AppEngine自动生成的ID保证是唯一的 关于你的问题,我们有以下几点:
get\u或\u insert
是强一致的,您执行的查询(qry=UserModel.query()
)也不是。因此,可能会导致覆盖现有实体。有关最终一致性的更多信息,请查看