我需要将产品添加到我的数据存储区。如果产品已经存在,那么我需要分配另一个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
最好的方法是什么?哪一个会更快?
答案 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
则不支持。
你提议的用法相当令人困惑 - 关键名称的重点是使用具有一些外在含义的自然键,但是你要发明新的键取决于是否已使用现有键。