Appengine 数据存储无法更新多条记录

1 投票
2 回答
1180 浏览
提问于 2025-04-16 03:12
        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 个实体。

撰写回答