Appengine 数据存储无法更新多条记录
votergroup = db.GqlQuery("SELECT * FROM Voter WHERE lastname = :1", 'AGEE')
for voter in votergroup:
voter.email = 'testemail@testemail.com'
db.put(votergroup)
上面的代码似乎没有按照应用引擎的文档更新记录。我也尝试过使用查询对象,但没有成功。我知道votergroup正在拉取记录,因为我在调试时对这个对象进行了计数,结果显示有10条记录。实际上,在执行db.put之前,我遍历了voter.email,似乎这个变量已经被设置好了。然而,变化似乎从来没有成功保存到数据库中。
有没有人知道我可能哪里做错了?
2 个回答
1
试试这个:
votergroup = db.GqlQuery("SELECT * FROM Voter WHERE lastname = :1", 'AGEE')
for voter in votergroup:
voter.email = 'testemail@testemail.com'
voter.put()
我觉得用这个应用引擎没有办法进行批量编辑。
3
你需要在用 db.Query()
创建的查询上调用 fetch()
,这样才能得到一个实体的列表。然后你可以用 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()
,你仍然可以遍历结果,这时会在需要时通过数据存储进行小批量的获取。调用查询上的 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()
。
你可以使用 游标 将获取的内容分成更大的块。我相信,虽然找不到证据,但 fetch()
的限制是 1000 个实体。