Python 如何为所有NDB数据存储条目分配默认值?
我必须向现有NDB类添加一个新属性:Python 如何为所有NDB数据存储条目分配默认值?,python,google-app-engine,app-engine-ndb,Python,Google App Engine,App Engine Ndb,我必须向现有NDB类添加一个新属性: class AppList(ndb.Model): ... ignore = ndb.BooleanProperty(default=False) # new property 然后我将使用它,如下所示: entries = AppList.query() entries = entries.filter(AppList.counter > 5) entries = entries.filter(AppList.ignore == F
class AppList(ndb.Model):
...
ignore = ndb.BooleanProperty(default=False) # new property
然后我将使用它,如下所示:
entries = AppList.query()
entries = entries.filter(AppList.counter > 5)
entries = entries.filter(AppList.ignore == False)
entries = entries.fetch()
我无法使用AppList.ignore!=True
以捕获早期添加的记录(不具有ignore
属性),因此我必须为我的AppList
实体中的所有记录分配False
。最有效的方法是什么?目前,该实体包含大约4000个条目
Upd。我决定使用以下难看的代码(没有成功应用游标
),它作为cron作业运行。但我不是每次都更新同样的100条记录吗
entities = AppList.query()
# entities = entities.filter(AppList.ignore != False)
entities = entities.fetch(100)
while entities:
for entity in entities:
entity.ignore = False
entity.put()
entities = AppList.query()
# entities = entities.filter(AppList.ignore != False)
entities = entities.fetch(100)
您可以尝试使用hasattr检查记录是否具有ignore属性 如果只想为AppList实体中的所有记录分配False,则只需更新模式(重新加载models.py文件),然后就可以将属性设置为False 可以找到有关架构更新的更多信息 编辑: 要回答您的评论:
if hasattr(entity, 'ignore'):
#your code goes here
在不部署新代码的情况下,最简单的方法是使用远程api,执行一个查询,获取所有实体,并将属性值设置为false,然后将其放入()。4000张唱片并不多
事实上,您甚至不需要显式设置该值,如果当前没有值,则在检索到默认值时将其设置。您更新的代码将仅更新前100个实体。尝试使用游标 如果不能使用游标,则使用偏移量,并在每个循环上将偏移量增加100,或者通过fetch()一次获取所有条目(游标方法更好) 而不是一个接一个地使用它们 ndb.put\U multi(要放置的实体列表)
这将比逐个放置快得多不要忘记,在这些情况下会使用MapReduce库。但我认为最好的方法是把所有这些建议结合起来 现在,您需要get()和put()4000个实体,问题是如何降低此操作的“成本” 我只是想知道你的
bool(entity.ignore)
返回了什么。如果缺失
属性返回False,您可以调整代码,将其视为False并推迟操作。如果出于其他原因放置(),由于默认参数,属性ignore
将写入False
。因此,对于其他实体,可以运行这样的脚本(通过远程api):
如何将
hasattr
与fetch
一起使用?请参阅我更新的问题-主要问题是如何获取没有此属性的实体。不幸的是,看起来我必须设置值-请参阅我的问题,如果我使用query
,则它不会“应用”默认值。哦,这只是在结果集上的一个简单for循环,设置值并放置。谢谢。我曾尝试使用游标
,但我不明白当我称之为第二次/第三次等时,应该是什么开始游标
值。每次使用游标进行查询时,您都会得到一组数据和一个游标,直到您到达数据的末尾并且没有游标为止(或者游标没有,我忘记了是哪个)。谢谢。请您澄清以下行的作用:put_queue=[ent for ent in res if not hasattr(ent,'ignore')]
?如果条目没有'ignore'属性,那么会发生什么?答案已编辑:ndb.get_multi()需要一个实体列表。该行创建一个列表,其中仅包含不具有“忽略”属性的实体。它对4个新行也有同样的作用。我理解正确吗?您的代码实际上没有将默认值False
分配给ignore
属性?也就是说,在put\u queue.append(ent)
?put()或put\u multi()之前,缺少一行ent.ignore=False
。如果模型中没有默认参数,就需要这一行。那就奇怪了。因为我已经在我的数据库上运行了你的代码,但它没有用这个缺少的值更新条目。。。是的,我在模型中有default=False
参数。
def iter_entities(cursor=None):
entries = AppList.query()
res, cur, more = entries.fetch_page(100, start_cursor=cursor)
put_queue = [ent for ent in res if not hasattr(ent, 'ignore')]
# put_queue = []
# for ent in res:
# if not hasattr(ent, 'ignore'):
# put_queue.append(ent)
ndb.put_multi(put_queue)
if more:
iter_entities(cur) # a taskqueue is better