sqlalchemy - 通过项目管道提交数据库的最佳方式?
问题描述
好吧,我正在使用 Scrapy 和 SQLAlchemy 来抓取数据并将其存储到 SQLite DB 中。现在,一切工作正常,但有些东西让我烦恼,我找不到答案。
因此,在 Pipelines 内的 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是要走的路。会话不应该那么昂贵。
或者,不要使用 SQL Alchemy,或者只使用SQL Alchemy Core而不是 ORM。
推荐阅读
- sql-server - 在水晶报表的参数中使用类似 SQL 的运算符
- python-imageio - imageio(Python)上的函数 imwrite 似乎正在重新缩放图像数据
- javascript - 实时更改中继器内的标签
- url - 获取 IndexPath for - UITextView 应与 indexPath 处的 URL 交互
- javascript - 如何从后端服务器获取 mapbox 访问令牌,而不是在模块导入语句中对其进行硬编码?
- javascript - Puppeteer 查询选择器 - 如何获得第二场比赛
- python - 为什么单次调用 Keras model.predict() 使用 1.3 GB 内存?
- c# - 非贪婪正则表达式以但不包含字符串开头
- talend - 无法通过 metaservlet api 将 talend 作业 zip 文件从 Windows 机器上传到 tac
- xml - 按名称将子项合并到未知父项中