使用 peewee 进行多处理批量插入
Bulk insert with multiprocessing using peewee
我正在 Python 3.4 中开发简单的 html scraper,使用 peewee 作为 ORM(很棒的 ORM 顺便说一句!)。我的脚本需要一堆站点,提取必要的数据并将它们保存到数据库中,但是每个站点都在分离过程中被抓取,以提高性能并且保存的数据应该是唯一的。不仅站点之间可能存在重复数据,而且在特定站点上也可能存在重复数据,因此我只想将它们存储一次。
示例:
Post 和类别 - 多对多关系。在抓取过程中,同一类别在不同的 post 中出现多次。我第一次想将该类别保存到数据库(创建新行)。如果同一类别出现在不同的 post 中,我想将该 post 与数据库中已创建的行绑定。
我的问题是 - 我是否必须使用原子 updates/inserts(插入一个 post,保存,get_or_create 类别,保存,向多对多表插入新行,保存)或者我可以以某种方式使用批量插入吗?解决该问题最快的方法是什么?也许一些进程之间共享的临时表,将在工作结束时批量插入?我正在使用 MySQL db.
谢谢你的回答和你的时间
您可以依靠数据库通过向字段或多列唯一索引添加 unique=True
来强制执行唯一约束。您还可以查看有关 get/create 和批量插入的文档:
- http://docs.peewee-orm.com/en/latest/peewee/models.html#indexes-and-unique-constraints
- http://docs.peewee-orm.com/en/latest/peewee/querying.html#get-or-create
- http://docs.peewee-orm.com/en/latest/peewee/querying.html#bulk-inserts
- http://docs.peewee-orm.com/en/latest/peewee/querying.html#upsert - upsert with on conflict
自己找了一会儿,终于找到了!
您可以使用 on_conflict_replace() 或 on_conflict_ignore() 函数来定义当记录存在于具有唯一性约束的 table 中时的行为。
PriceData.insert_many(values).on_conflict_replace().execute()
或
PriceData.insert_many(values).on_conflict_ignore().execute()
“更新插入”下的更多信息here
我正在 Python 3.4 中开发简单的 html scraper,使用 peewee 作为 ORM(很棒的 ORM 顺便说一句!)。我的脚本需要一堆站点,提取必要的数据并将它们保存到数据库中,但是每个站点都在分离过程中被抓取,以提高性能并且保存的数据应该是唯一的。不仅站点之间可能存在重复数据,而且在特定站点上也可能存在重复数据,因此我只想将它们存储一次。
示例: Post 和类别 - 多对多关系。在抓取过程中,同一类别在不同的 post 中出现多次。我第一次想将该类别保存到数据库(创建新行)。如果同一类别出现在不同的 post 中,我想将该 post 与数据库中已创建的行绑定。
我的问题是 - 我是否必须使用原子 updates/inserts(插入一个 post,保存,get_or_create 类别,保存,向多对多表插入新行,保存)或者我可以以某种方式使用批量插入吗?解决该问题最快的方法是什么?也许一些进程之间共享的临时表,将在工作结束时批量插入?我正在使用 MySQL db.
谢谢你的回答和你的时间
您可以依靠数据库通过向字段或多列唯一索引添加 unique=True
来强制执行唯一约束。您还可以查看有关 get/create 和批量插入的文档:
- http://docs.peewee-orm.com/en/latest/peewee/models.html#indexes-and-unique-constraints
- http://docs.peewee-orm.com/en/latest/peewee/querying.html#get-or-create
- http://docs.peewee-orm.com/en/latest/peewee/querying.html#bulk-inserts
- http://docs.peewee-orm.com/en/latest/peewee/querying.html#upsert - upsert with on conflict
自己找了一会儿,终于找到了!
您可以使用 on_conflict_replace() 或 on_conflict_ignore() 函数来定义当记录存在于具有唯一性约束的 table 中时的行为。
PriceData.insert_many(values).on_conflict_replace().execute()
或
PriceData.insert_many(values).on_conflict_ignore().execute()
“更新插入”下的更多信息here