Appengine数据存储区不更新多个记录

时间:2010-08-24 03:59:52

标签: python google-app-engine datastore

        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循环,似乎设置了变量。但是,这种变化似乎永远不会让它回到数据库。

有谁知道我可能做错了什么?

2 个答案:

答案 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()

我认为没有办法使用应用引擎进行批量修改。