Как переместить все атрибуты в хранилище данных со значением True в другое хранилище данных?

#python #google-app-engine #cron #google-cloud-datastore #gql

#python #google-app-engine #cron #google-cloud-хранилище данных #gql

Вопрос:

Есть ли способ переместить все атрибуты внутри модели со значением 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: и каждая криминальная история добавляется в историю с указанием их местоположения.
Но истории не отображаются в модели истории?!

 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 модели: статья и рассказ.
Все статьи хранятся в модели article, и любая статья с crime = True устанавливается в модели Story.
По какой-то причине истории не перемещаются.
Cron запущен и не содержит ошибок в журнале.
Могу ли я выполнить эту задачу в своей панели управления?
Я запросил обе модели :

ВЫБЕРИТЕ * ИЗ СПИСКА ПОРЯДОК статей По дате DESC

В модели статьи есть истории с сегодняшней даты (2 мая)

В Story есть статьи от 19 апреля и с тех пор их больше нет. Могу ли я запросить модели и сказать переместить все объекты с crime, установленным в true, в модель истории?

Комментарии:

1. Ваше приложение имеет 1 базу данных / хранилище данных. У вас есть 2 модели.

Ответ №1:

Я не вижу ничего явно неправильного в вашем коде. Поскольку мы уже установили, что ошибок нет, моим советом было бы добавить еще logging.info вызывает более высокий уровень, чтобы увидеть, какой оператор if принимает значение false, или какой цикл for выполняет итерацию по пустому набору. Кроме того, вы подтвердили, что crimechecker успешно присваивает новым криминальным историям значение True? Не похоже, что вы определили, какое из ваших двух заданий cron является ошибкой.

Что касается более фундаментального, я думаю, вам следует пересмотреть базовый дизайн этой задачи. Давайте классифицируем это как 3 шага:

  1. Пользователь создает новый объект Article с заголовком и телом
  2. Если тело содержит определенные ключевые слова, пометьте его как содержащее преступление.
  3. Если оно содержит преступление, создайте соответствующий объект Story.

Почему бы просто не выполнить всю эту работу в одном обработчике при сохранении статьи? Зачем разбивать его на три отдельные части? Помимо усложнения операции, ваше задание 2nd cron также неэффективно в масштабе. Вы извлекаете все криминальные истории с начала времен и выполняете по одному запросу для каждой, чтобы увидеть, есть ли соответствующая история. Если вы накопите значительное количество статей, это не будет завершено вовремя.

Если вы беспокоитесь о влиянии выполнения всех этих задач при первом сохранении статьи на производительность, используйте очередь задач. Когда статья будет впервые сохранена, создайте одну задачу для сканирования ее на предмет ключевых слов преступления. Если ключевые слова найдены, создайте одну задачу для хранения соответствующего объекта истории. Передайте ключ сущности в параметрах задачи, чтобы вам не приходилось запрашивать что-либо.

Комментарии:

1. Спасибо за ваш ответ, Дрю, к сожалению, этот проект должен быть завершен в этот четверг, поэтому изменение основ на данном этапе оставляет у меня мало времени 🙁 Но я думаю, что ваш комментарий «Если вы накопите значительное количество статей, это не завершится вовремя» Является проблемой после более тщательного изучения… Я запустил / place вручную и получил сообщение «Время ожидания операции хранилища данных истекло, или данные были временно недоступны». Возможно, удаление проверки, чтобы увидеть, является ли история хитрым ходом, но с ограниченным временем это может быть моим единственным вариантом… Еще раз спасибо.

2. Простым обходным решением было бы добавить другой bool по умолчанию в Article model, created_story=False. Во 2-м задании cron измените свой фильтр на crime= True и created_story=False. Пропустите запрос Story.all() внутри цикла, но обновите статью до created_story=True после создания истории. Это должно сделать его масштабируемым. Вы можете использовать remote_api, чтобы вернуться назад и установить bool для существующих данных.