Google App Engine - 删除直到count()<= 0

use*_*918 2 google-app-engine

这两段代码有什么区别?

query=Location.all(keys_only=True)
while query.count()>0:
  db.delete(query.fetch(5))

# --

while True:
  query=Location.all(keys_only=True)
  if not query.count():
    break
  db.delete(query.fetch(5))
Run Code Online (Sandbox Code Playgroud)

他们都工作.

Dav*_*ill 6

从逻辑上讲,这两段代码执行完全相同的操作 - 它们一次删除每个Location实体5个.

第一段代码在样式方面和(略微)性能方面都更好.(查询本身不需要在每个循环中重建).

但是,此代码的效率并不高.它有几个问题:

  1. 你使用count()但不需要.简单地获取实体,然后测试结果以查看是否有任何实体会更有效.

  2. 您正在向数据存储区进行更多往返访问.每个count(),fetch()delete()调用必须进入数据存储区并返回.这些往返很慢,所以你应该尽量减少它们.您可以通过在每个循环中获取更多实体来完成此操作.

例:

q = Location.all(keys_only=True)
results = q.fetch(500)
while results:
    db.delete(results)
    results = q.fetch(500)
Run Code Online (Sandbox Code Playgroud)

编辑:看看下面的Nick的答案 - 他解释了为什么使用查询游标可以进一步提高代码的性能.