votergroup = db.GqlQuery("SELECT * FROM Voter WHERE lastname = :1", 'AGEE')
for voter in votergroup:
voter.email = 'testemail@testemail.com'
db.put(votergroup)
上面的代码似乎并没有像它在 appengine 文档中显示的那样更新记录。我也尝试使用查询对象无济于事。我知道 votergroup 正在提取记录,因为我在调试时对该对象进行了计数,它显示了 10 条记录。事实上,在 db.put 之前,我遍历了 voter.email,看起来变量已经设置好了。但是,更改似乎永远不会返回到数据库。
有谁知道我可能做错了什么?
最佳答案
您需要对使用 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()
,您仍然可以遍历结果,并且将进行数据存储 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 分解成更大的 block 。我相信,虽然我找不到任何证据,但 fetch()
有 1000 个实体的限制。
关于python - Appengine 数据存储不更新多条记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3553481/