python - Appengine 数据存储不更新多条记录

标签 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 文档中显示的那样更新记录。我也尝试使用查询对象无济于事。我知道 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/

相关文章:

python - 如何为 QTableView 列设置标题标签?

google-app-engine - 在 Google appengine 中禁用版本特定的 url

google-app-engine - GAE 推送队列任务不在测试中运行,生成孤立的 dev_appserver 进程

python - gae 有没有 twitter 用户登录框架

node.js - 如何对 Google Datastore 中的大量实体进行求和?

python - django 中的动态表单与 ajax/dajax

python - NumPy 广播 : Calculating sum of squared differences between two arrays

python - 在单独的线程中启动 flask 应用程序

python - 使用 deferred.defer 任务发布到数据存储时出现问题

java - 我可以将实体指定为数据存储属性以实现类似联接的功能吗?