用SQLAlchemy进行批量上载[英] Bulk upsert with SQLAlchemy

本文是小编为大家收集整理的关于用SQLAlchemy进行批量上载的处理方法,想解了用SQLAlchemy进行批量上载的问题怎么解决?用SQLAlchemy进行批量上载问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

我正在使用 SQLAlchemy 1.1.0b 将大量数据批量更新插入 PostgreSQL,但遇到了重复的键错误.

from sqlalchemy import *
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.automap import automap_base

import pg

engine = create_engine("postgresql+pygresql://" + uname + ":" + passw + "@" + url)

# reflectively load the database.
metadata = MetaData()
metadata.reflect(bind=engine)
session = sessionmaker(autocommit=True, autoflush=True)
session.configure(bind=engine)
session = session()
base = automap_base(metadata=metadata)
base.prepare(engine, reflect=True)

table_name = "arbitrary_table_name" # this will always be arbitrary
mapped_table = getattr(base.classses, table_name)
# col and col2 exist in the table.
chunks = [[{"col":"val"},{"col2":"val2"}],[{"col":"val"},{"col2":"val3"}]]

for chunk in chunks:
    session.bulk_insert_mappings(mapped_table, chunk)
    session.commit()

当我运行它时,我得到了这个:

sqlalchemy.exc.IntegrityError: (pg.IntegrityError) ERROR:  duplicate key value violates unique constraint <constraint>

我似乎也无法正确地将 mapped_table 实例化为 Table() 对象.

我正在处理时间序列数据,因此我正在批量获取时间范围内有一些重叠的数据.我想做一个批量更新以确保数据的一致性.

使用大型数据集进行批量更新插入的最佳方法是什么?我现在知道 PostgreSQL 支持 upserts,但是我不确定如何在 SQLAlchemy 中执行此操作.

推荐答案

来自 https://stackoverflow.com/a/26018934/465974

<块引用>

找到这个命令后,我能够执行 upserts,但它是值得一提的是,对于批量"upsert",此操作很慢.

另一种方法是获取您想要的主键列表upsert,并在数据库中查询任何匹配的 id:

本文地址:https://www.itbaoku.cn/post/1763747.html