Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google app engine 在Python NDB数据存储中基于序列号创建固定宽度ID_Google App Engine_Google Cloud Datastore_App Engine Ndb - Fatal编程技术网

Google app engine 在Python NDB数据存储中基于序列号创建固定宽度ID

Google 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

我有一个名为UserModel的模型,我知道它永远不会超过10000个实体。我在UserModel中没有任何唯一的东西可以用来创建密钥。因此,我决定使用这种格式的字符串键USRXXXXX

其中XXXXX表示序列计数。e、 g USR00001,USR12345

因此,我选择了以下方法来生成ID

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_或_insert可以保证我永远不会有重复的记录吗

  • 它会增加我的账单吗?因为在没有任何过滤器的情况下,我需要计算一个doing UserModel.query()的记录数。在某种程度上,我正在获取所有记录。或者,在用户获取qry对象上的api之前,账单不会出现在图片中

  • 可能不会。如果您的UserModel实体具有更强的一致性,那么您可能会逃脱您试图做的事情

  • 否,
    get\u或\u insert
    不保证您不会有重复项。虽然在这种情况下不太可能有重复的数据,但更可能丢失数据。假设您正在插入两个没有祖先的实体-
    Model.query().count()
    可能需要一些时间来反映第一个实体的创建,从而导致第二个实体与第一个实体具有相同的ID,从而覆盖它(即,您最终得到的第二个实体只有第一个实体的ID)

  • Model.query().count()
    len(Model.query().fetch())
    的缩写(尽管有一些优化),因此每次生成ID时都会获取所有实体

  • 可能不会。如果您的UserModel实体具有更强的一致性,那么您可能会逃脱您试图做的事情

  • 否,
    get\u或\u insert
    不保证您不会有重复项。虽然在这种情况下不太可能有重复的数据,但更可能丢失数据。假设您正在插入两个没有祖先的实体-
    Model.query().count()
    可能需要一些时间来反映第一个实体的创建,从而导致第二个实体与第一个实体具有相同的ID,从而覆盖它(即,您最终得到的第二个实体只有第一个实体的ID)

  • Model.query().count()
    len(Model.query().fetch())
    的缩写(尽管有一些优化),因此每次生成ID时都会获取所有实体

  • 可能不会。如果您的UserModel实体具有更强的一致性,那么您可能会逃脱您试图做的事情

  • 否,
    get\u或\u insert
    不保证您不会有重复项。虽然在这种情况下不太可能有重复的数据,但更可能丢失数据。假设您正在插入两个没有祖先的实体-
    Model.query().count()
    可能需要一些时间来反映第一个实体的创建,从而导致第二个实体与第一个实体具有相同的ID,从而覆盖它(即,您最终得到的第二个实体只有第一个实体的ID)

  • Model.query().count()
    len(Model.query().fetch())
    的缩写(尽管有一些优化),因此每次生成ID时都会获取所有实体

  • 可能不会。如果您的UserModel实体具有更强的一致性,那么您可能会逃脱您试图做的事情

  • 否,
    get\u或\u insert
    不保证您不会有重复项。虽然在这种情况下不太可能有重复的数据,但更可能丢失数据。假设您正在插入两个没有祖先的实体-
    Model.query().count()
    可能需要一些时间来反映第一个实体的创建,从而导致第二个实体与第一个实体具有相同的ID,从而覆盖它(即,您最终得到的第二个实体只有第一个实体的ID)

  • Model.query().count()
    len(Model.query().fetch())
    的缩写(尽管有一些优化),因此每次生成ID时都会获取所有实体


  • 因为您只需要UserModel实体的唯一键,所以我不太理解为什么需要手动创建键。AppEngine自动生成的ID保证是唯一的

    关于你的问题,我们有以下几点:

  • 我想不是。也许您应该首先分配ID(检查部分),订购并使用它

  • 即使
    get\u或\u insert
    是强一致的,您执行的查询(
    qry=UserModel.query()
    )也不是。因此,可能会导致覆盖现有实体。有关最终一致性的更多信息,请查看

  • 不,这不会增加你的账单。执行
    Model.query().count()
    时,引擎盖下的数据存储执行
    Model.query().fetch(keys\u only=True)
    ,并计算结果数。仅按键查询生成小型数据存储操作,这些操作基于谷歌最新的定价变化,不可计费


  • 因为您只需要UserModel实体的唯一键,所以我不太理解为什么需要手动创建键。AppEngine自动生成的ID保证是唯一的

    关于你的问题,我们有以下几点:

  • 我想不是。也许您应该首先分配ID(检查部分),订购并使用它

  • 即使
    get\u或\u insert
    是强一致的,您执行的查询(
    qry=UserModel.query()
    )也不是。因此,可能会导致覆盖现有实体。有关最终一致性的更多信息,请查看

  • 没有