我正在使用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()
对象。
我正在使用时间序列数据,所以我正在批量抓取数据,并在时间范围内有一些重叠。我想进行批量upsert以确保数据的一致性。
使用大型数据集进行批量upsert的最佳方法是什么?我现在知道PostgreSQL support upserts,但我不确定如何在SQLAlchemy中执行此操作。
答案 0 :(得分:2)
来自https://stackoverflow.com/a/26018934/465974
在我找到这个命令之后,我能够执行upserts,但确实如此 值得一提的是,对于批量“upsert”来说,这个操作很慢。
另一种方法是获取您想要的主键列表 upsert,并在数据库中查询任何匹配的ID: