如何验证数据存储区中是否已存在具有特定key_name的记录?

时间:2011-10-16 13:04:58

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

我需要将产品添加到我的数据存储区。如果产品已经存在,那么我需要分配另一个key_name。 比方说,我已经: product = MyDBModelProduct(key_name ='milk') 现在当我添加另一种产品(再次加入牛奶)时,我需要添加key_names milk-1,milk-2,milk-3等等。 因此,在添加新的db记录之前,我需要验证牛奶是否已经存在。 我看到了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

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

1 个答案:

答案 0 :(得分:3)

选项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则不支持。

你提议的用法相当令人困惑 - 关键名称的重点是使用具有一些外在含义的自然键,但是你要发明新的键取决于是否已使用现有键。