【问题标题】:How can I verify if record with particular key_name already exists in the datastore?如何验证数据存储中是否已存在具有特定 key_name 的记录?
【发布时间】:2011-12-08 17:24:48
【问题描述】:

我需要将产品添加到我的数据存储区。如果产品已经存在,那么我需要分配另一个key_name。 假设,我已经有: 产品 = MyDBModelProduct(key_name='milk') 现在,当我添加其他产品(再次添加牛奶)时,我需要使用 key_names milk-1、milk-2、milk-3 等添加它们。 所以,在添加新的数据库记录之前,我需要验证牛奶是否已经存在。 我看到了 3 种可能的方法:

(1)GqlQuery用法:

proposed_key_name = 'milk'
product = db.GqlQuery("SELECT * FROM MyDBModelProduct WHERE key_name = :1 LIMIT 1", proposed_key_name).fetch(1)
if (len(product) > 0): # can not use this name, should look for milk-2, milk-3...

(2)all用法:

query = MyDBModelProduct.all()
count = query.filter('key_name =', proposed_key_name).count()

(3)get_by_key_name用法:

id_key_name = proposed_key_name
id_count = 1
while MyDBModelProduct.get_by_key_name(id_key_name) is not None:
    id_key_name = proposed_key_name + '-' + id_count
    id_count += 1

最好的方法是什么?哪一个会工作得更快?

【问题讨论】:

    标签: google-app-engine google-cloud-datastore


    【解决方案1】:

    选项 1 和 2 相同。两者都不起作用,因为key_name 不是一个有效的过滤器——相反,您需要构造一个完全限定的键并对其进行查询——例如,.filter('__key__ =', my_key)。您还应该进行仅键查询 - SELECT __key__MyDBModelProduct.all(keys_only=True),因为您不需要实际的模型实体。

    就目前而言,数字 3 比 1 和 2 快,但如果您按上述方式修改查询,则 1 或 2 会更快。如果需要批量处理,get/get_by_key_name 支持批量操作,而Query 不支持。

    不过,您提议的用法相当令人困惑 - 键名的全部意义在于使用具有某些外部含义的自然键,但您正在根据现有键是否已经使用而发明新键。

    【讨论】:

      猜你喜欢
      • 2011-09-25
      • 1970-01-01
      • 1970-01-01
      • 2017-08-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-17
      • 2011-12-12
      相关资源
      最近更新 更多