Оптимальный способ фиксации в БД через Item Pipeline? - PullRequest
0 голосов
/ 09 мая 2019

Хорошо, я использую Scrapy & SQLAlchemy, чтобы очистить данные и сохранить их в БД SQLite. Теперь все работает нормально, но что-то меня беспокоит, и я не могу найти ответ.

Итак, в функции process_item внутри конвейеров, каков оптимальный способ фиксации в БД. Большинство людей, кажется, делают что-то вроде этого:

   def process_item(self, item, spider):
        """
        session = self.Session()
        #Do some stuff
        try:
            session.add(ItemClass)
            session.commit()
        except:
            session.rollback()
            raise
        finally:
            session.close()

        return item

И я тоже видел это:

   def close_spider(self, spider):
        # We commit and save all items to DB when spider finished scraping.
        try:
            self.session.commit()
        except:
            self.session.rollback()
            raise
        finally:
            self.session.close()

Мой основной запрос вращается вокруг метода 1. Кажется неэффективным получать сеанс каждый раз, фиксировать отдельный элемент в БД, а затем закрывать сеанс для каждого отдельного элемента. Теперь второй метод вызывает у меня и то, что он ожидает завершения процесса очистки, чтобы зафиксировать его в БД, что может вызвать проблемы в случае сбоя паука и потери всего очищенного.

Есть ли промежуточное значение, могу ли я зафиксировать каждые n элементов? Или это не имеет значения, поскольку современные БД настолько мощные, что им не нужны множественные коммиты за короткое время. В основном речь идет об оптимизации процесса фиксации, возможно, я обдумываю это.

1 Ответ

0 голосов
/ 09 мая 2019

Метод 1 - это путь. Сеансы не должны быть такими дорогими.

В качестве альтернативы, не используйте SQL Alchemy или используйте только SQL Alchemy Core вместо ORM.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...