votergroup = db.GqlQuery("SELECT * FROM Voter WHERE lastname = :1", 'AGEE')
for voter in votergroup:
voter.email = 'testemail@testemail.com'
db.put(votergroup)
上面的代码似乎没有更新记录,因为它在appengine文档中显示。我也试过使用查询对象无济于事。我知道选民组正在拉记录,因为我在调试时对对象进行了计数,它显示了10条记录。事实上,在db.put之前,我通过voter.email循环,似乎设置了变量。但是,这种变化似乎永远不会让它回到数据库。
有谁知道我可能做错了什么?
答案 0 :(得分:3)
您需要在使用fetch()
创建的查询上调用db.Query()
,让它返回实体列表。然后,您可以致电put(list_of_entities)
将其全部保留。看起来像这样:
voters = db.GqlQuery("SELECT * FROM Voter WHERE lastname = :1", 'AGEE').fetch(10)
for voter in voters:
voter.email = 'testemail@testemail.com'
db.put(voters)
如果您没有在查询上调用fetch()
,您仍然可以迭代结果,并且将根据需要使用数据存储区RPC来检索小批量。在查询上调用put()
不会执行任何操作,但您仍可以对循环内的每个实体执行操作。
voters_query = db.GqlQuery("SELECT * FROM Voter WHERE lastname = :1", 'AGEE')
for voter in voters_query:
voter.email = 'testemail@testemail.com'
voter.put()
请注意,这会为每个实体执行一次数据存储调用,并为每个批处理迭代执行一次调用。除非您不知道将返回多少项,否则使用fetch()
要好得多。
您可以使用cursors来提升到更大的块。我相信,虽然我找不到任何证据,fetch()
有1000个实体的限制。
答案 1 :(得分:1)
请改为尝试:
votergroup = db.GqlQuery("SELECT * FROM Voter WHERE lastname = :1", 'AGEE')
for voter in votergroup:
voter.email = 'testemail@testemail.com'
voter.put()
我认为没有办法使用应用引擎进行批量修改。