【问题标题】:How to move all attributes in a datastore with value True to another datastore?如何将数据存储中值为 True 的所有属性移动到另一个数据存储?
【发布时间】:2011-08-16 21:49:50
【问题描述】:

有没有办法将一个模型中的所有属性设置为 True 到另一个模型? 我正在用 Python 编写并具有以下内容:

 class crimechecker(webapp.RequestHandler):
    def get(self):
        #Checks for crime
        articles = Article.all().filter('crime = ', None)
        for article in articles:
            crime = False
            for word in triggers:
                body = article.body
                if body.find(word) != -1:
                    crime = True
            article.crime = crime
            a = article.put()

然后运行一个单独的 cron:每个犯罪故事都将添加到 Story 及其位置。 但是故事没有出现在故事​​模型中?!

class place(webapp.RequestHandler):
    def post(self):
        # Check for any article which was classified as "TRUE" therefore it is a crime document
        crimes = Article.all().filter('crime = ', True)
        for crimestory in crimes:
            if Story.all().filter('title = ', crimestory.title).count() == 0:
                #Yahoo Placemaker key
                p = placemaker('HSnG9pPV34EUBcexz.tDYuSrZ8Hnp.LowswI7TxreF8sXrdpVyVIKB4uPGXBYOA9VjjF1Ca42ipd_KhdJsKYjI5cXRo0eJM-')
                #Encoding for symbols and euro signs etc.
                print p.find_places(crimestory.body.encode('utf-8'))
                for place in p.places:
                    splitted = place.name.split()
                    #Check for locations within Ireland (IE)
                    if 'IE' in splitted:
                        story = Story(long=place.centroid.longitude, lat=place.centroid.latitude, link=crimestory.link, loc_name=place.name, title=crimestory.title, date=crimestory.date).put()
                        logging.info(story)

我有 2 个模型:文章和故事。 所有文章都存储在文章模型中,并且任何带有 crime = True 的文章都设置在 Story 模型中。 出于某种原因,它没有移动故事。 cron 正在运行并且没有任何日志错误。 我可以在我的仪表板中执行此任务吗? 我已经查询了这两个模型:

SELECT * FROM Article ORDER BY date DESC

文章模型包含今天(5 月 2 日)的故事

Story 有 4 月 19 日的文章,此后不再有文章。 我可以查询模型并说将所有犯罪设置为 true 的实体移至 Story 模型吗?

【问题讨论】:

  • 您的应用程序有 1 个数据库/数据存储。你有 2 个模型。

标签: python google-app-engine cron google-cloud-datastore gql


【解决方案1】:

我看不出您的代码有任何明显错误。由于我们已经确定没有错误,我的建议是添加更多的 logging.info 调用,以查看哪个 if 语句评估为 false,或者哪个 for 循环正在迭代一个空集。另外,您是否确认犯罪检查器成功地将新的犯罪故事设置为真实?听起来您并没有确定您的两个 cron 作业中的哪一个有问题。

更根本的是,我认为你应该重新考虑这个任务的基本设计。让我们将其分为 3 个步骤:

  1. 用户创建具有标题和正文的新文章实体
  2. 如果正文包含某些关键字,请将其标记为包含犯罪。
  3. 如果它包含犯罪,则创建相应的 Story 实体。

为什么不在保存文章时在一个处理程序中完成所有这些工作?为什么要把它分成三个不同的部分?除了使操作复杂之外,您的第二个 cron 作业在规模上也效率低下。你从一开始就获取每一个犯罪故事,并为每个犯罪故事做一个查询,看看是否有相应的故事。如果您积累了大量文章,这将无法及时完成。

如果您担心在首次保存文章时执行所有这些任务会影响性能,请使用任务队列。首次保存文章时,创建一个任务来扫描它以查找犯罪关键字。如果找到关键字,则创建一个任务来存储相应的故事实体。在任务参数中传递实体键,这样您就不必查询任何内容。

【讨论】:

  • 感谢您的回复 Drew,不幸的是,这个项目将于本周四到期,因此在此阶段更改基本面让我时间紧迫 :-( 但我认为您的评论“如果您积累了大量文章,这不会及时完成”是仔细检查后的问题...我手动运行/放置并得到“数据存储操作超时,或数据暂时不可用。”也许删除检查以查看故事是否一个狡猾的举动,但时间有限,这可能是我唯一的选择......再次感谢。
  • 一个简单的解决方法是在文章模型上添加另一个默认布尔值 created_story=False。在第二个 cron 作业中,将您的过滤器更改为 crime=True 和 created_story=False。跳过循环内的 Story.all() 查询,但在创建故事后将文章更新为 created_story=True。这应该使其可扩展。您可以使用 remote_api 返回并在现有数据上设置布尔值。
猜你喜欢
  • 1970-01-01
  • 2018-09-28
  • 1970-01-01
  • 2015-06-27
  • 2012-06-21
  • 2015-09-15
  • 2020-09-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多