【问题标题】:Bulk insert with multiprocessing using peewee使用 peewee 进行多处理的批量插入
【发布时间】:2015-03-01 01:49:57
【问题描述】:

我正在 Python 3.4 中使用 peewee 作为 ORM(伟大的 ORM 顺便说一句!)来开发简单的 html 抓取工具。我的脚本需要一堆站点,提取必要的数据并将它们保存到数据库中,但是每个站点都在分离过程中被抓取,以提高性能并且保存的数据应该是唯一的。不仅站点之间可能存在重复数据,特定站点上也可能存在重复数据,因此我只想存储一次。

示例: 帖子和类别 - 多对多关系。在抓取过程中,同一类别在不同的帖子中出现多次。我第一次想将该类别保存到数据库(创建新行)。如果同一类别出现在不同的帖子中,我想将该帖子与数据库中已创建的行绑定。

我的问题是 - 我必须使用原子更新/插入(插入一篇文章、保存、get_or_create 类别、保存、将新行插入多对多表、保存)还是我可以以某种方式使用批量插入?解决这个问题的最快方法是什么?也许一些进程之间共享的临时表,将在工作结束时批量插入?我正在使用 MySQL 数据库。

感谢您的回答和您的时间

【问题讨论】:

    标签: python mysql multiprocessing bulkinsert peewee


    【解决方案1】:

    您可以依靠数据库通过将unique=True 添加到字段或多列唯一索引来强制执行唯一约束。您还可以查看有关获取/创建和批量插入的文档:

    【讨论】:

    • 好的,经过几次测试,我最终在帖子和类别表上正常保存 + 在 post_to_category 表上批量插入。没想到 peewee 大师的帮助,谢谢 m8 ;)
    • 根据常见问题解答,您不应该只是在答案上放一堆链接。
    • 我失败了。使用 sqlite 的多个进程的处理方式必须与 postgres 或 MySQL 不同,因此这是一个考虑因素。另一种是使用atomic 上下文管理器将插入包装在事务中,回滚和/或重试失败。
    • 我仍然没有遵循答案。如果有多个记录,我必须插入并且我需要检查该记录是否不存在。哪种方法最好?根据我的想法,唯一的选择是从数据库表中获取不匹配的唯一键,并在插入时跳过这些记录。有没有更好的办法?
    【解决方案2】:

    自己找了好久,终于找到了!

    您可以使用 on_conflict_replace() 或 on_conflict_ignore() 函数来定义记录存在于具有唯一性约束的表中时的行为。

    PriceData.insert_many(values).on_conflict_replace().execute()
    

    PriceData.insert_many(values).on_conflict_ignore().execute()
    

    “Upsert”下的更多信息here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-19
      • 2019-05-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-01
      • 2013-02-10
      • 2010-10-01
      相关资源
      最近更新 更多