【问题标题】:Doing a bulk copy of dictionary list to postgres using sqlalchemy使用 sqlalchemy 将字典列表批量复制到 postgres
【发布时间】:2018-10-20 13:30:19
【问题描述】:

我有一个字典列表list_dict,如下所示:

[{u'default_bhp': False, u'price_period': u'Monthly'},{u'default_bhp': False, u'price_period': u'Yearly'}]

目前我正在使用以下方法将其插入到我的数据库中:

conn = engine.connect()
conn.execute(ModelClass.__table__.insert(), list_dict)

我只是想检查是否有更快的方法将数据插入数据库,因为我有大量数据。

我们可以在这里使用大量的copy 或其他东西吗?

如何使用use_batch_mode 功能??如下所示:

 engine = create_engine('postgresql+psycopg2://postgres:postgres@localhost/test_db', use_batch_mode=True)
conn = engine.connect()
    conn.execute_batch(ModelClass.__table__.insert(), list_dict)

【问题讨论】:

  • 相关:stackoverflow.com/questions/43317376/…。要么使用COPY,要么在创建引擎时启用新的use_batch_mode 标志,这可能会加速你现有的代码。
  • 如何使用use_batch_mode ?我已经更新了我的问题。是否与字典列表一起使用这种方式?
  • docs.sqlalchemy.org/en/latest/dialects/…,只需将use_batch_mode=True 传递给create_engine。它将用于 DB-API executemany() 调用,您正在执行此操作(在后台)。

标签: python postgresql sqlalchemy


【解决方案1】:

考虑使用bulk_insert_mappings(如果您还不知道的话),这可能最接近您想要实现的目标。

但是,如果您实际上有 很多 数据,那么急切地解压到 dicts 列表中可能不是一个好方法,因此您可能需要在 bulk_insert 之上进行 grouper/chunk 管理

【讨论】:

  • 我正在逐行遍历 pandas 数据帧,检查一些验证,然后写入该 frame.to_dict(),然后附加到我的 list_dict。在循环之外,我正在做问题中提到的批量插入。对此有任何建议。与此同时,我正在阅读bulk_insert_mappings
  • 如果您需要验证每行的日期,我不知道如何加快速度。要走的路(可能)- 以约 1000 的批次处理您的行(获取 + 验证 + 添加到列表),而不是批量插入。您可以在这里轻松优化的唯一事情是网络往返 - 批量保存。
  • 你能否提供一个代码sn-p示例如何实现这一点。
猜你喜欢
  • 2019-12-02
  • 2019-08-17
  • 1970-01-01
  • 2022-01-11
  • 2023-03-26
  • 2021-05-19
  • 2019-03-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多