1
        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,看起来变量被设置了。但是,更改似乎永远不会回到数据库。

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

4

2 回答 2

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()除非您不知道要退回多少物品,否则使用起来会更好。

您可以使用游标将提取分成更大的块。我相信,虽然我找不到任何证据,但它fetch()有 1000 个实体的限制。

于 2010-08-24T04:10:11.270 回答
1

试试这个:

votergroup = db.GqlQuery("SELECT * FROM Voter WHERE lastname = :1", 'AGEE')

for voter in votergroup:
    voter.email = 'testemail@testemail.com'
    voter.put()

我认为没有办法使用应用引擎进行大规模编辑。

于 2010-08-24T04:02:32.647 回答