在Google App Engine的远程api中检索和写入实体时出错_外壳.py

2024-03-28 11:40:08 发布

您现在位置:Python中文网/ 问答频道 /正文

这是我的两难境地:我必须查看实体列表,检查某个重复属性(我使用的是NDB)是否为空。如果是,那么我给它赋值并put()。否则我跳过实体。我试图在googleappengine附带的远程登录shell中完成所有这些。在

我试着重复一遍模型.查询(),执行条件并写入值,但当我开始编写时,进程被挂起。当我最后使用Ctrl-C时,它弹出一个错误,说:“assertresponse.set_status_大小()==len(服务器密钥);AssertionError“。我假设这和它试图检索的实体的大小有关。有人知道怎么回事吗?以下是我当前的代码:

>>> for entity in Model.query():
...    if not len(entity.references):
...        entity.references = somevalue
...        continue
...    print 'skipped'

我只是过滤查询而不是使用if语句,但是我不确定如何根据重复属性的长度过滤查询。在


Tags: 实体列表lenif属性远程putshell
3条回答

代码示例在找到第一个没有引用的实体时返回(如果没有引用,则打印skipped),但是它可能会留下一些没有任何引用的实体。我不知道这是否是你想要的。在

如果只有几个引用值是可能的,例如['python'、'ruby'、'php'],那么我认为您可以像Model.query(Model.references.IN(['python', 'ruby', 'php'])))那样执行Repeated Properties查询,将该列表与所有实体的列表进行比较,然后迭代其余的实体。(我对NDB了解不多,我怀疑这是一个很好的方法,但希望它对某些数据集有效。)

我终于成功了!我使用query.fetch_page成批获取查询,然后迭代每个批并应用更改。在

>>> more = True
>>> cursor = None
>>> while more:
...     batch, cursor, more = MyModel.query().fetch_page(50, start_cursor=cursor)
...     for entity in batch:
...          if not len(entity.references):
...               entity.references = somevalue
...               entity.put()
...     print "finished batch"

你有多少实体?如果您有超过100个,那么从远程api查询是非常低效的(二次方的)。所以这可以解释为什么它挂了。在

你是对的,你不能写一个查询来检测你正在寻找的条件。在

相关问题 更多 >