2016-07-25 140 views
2

我正在使用SQLAlchemy 1.1.0b將大量數據插入到PostgreSQL中,並且出現重複鍵錯誤。使用SQLAlchemy批量插入

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_tableTable()對象,無論是。

我正在處理時間序列數據,所以我在時間範圍內重疊地抓取數據。我想做一個批量上傳來確保數據的一致性。

做一個大型數據集的批量upsert最好的方法是什麼?我現在知道PostgreSQL support upserts,但我不確定如何在SQLAlchemy中執行此操作。

+3

的[SQLAlchemy的可能的複製 - 如果存在執行批量更新插入(,更新,否則插入)在postgresql](http://stackoverflow.com/questions/25955200/sqlalchemy-performing-a-bulk-upsert-if-exists-update-else-insert-in-postgr) – FelixSFD

+0

可能重複的[如何在PostgreSQL中UPSERT(MERGE,INSERT ... ON DUPLICATE UPDATE)?](https://stackoverflow.com/questions/17267417/how-to-upsert-merge-insert-on-duplicate-update-in-postgresql ) – rjv

回答

1

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

我發現這個命令後,我能夠執行upserts,但它是 值得一提的是,該操作是批量「更新插入」慢。

另一種方法是讓主鍵的列表,你想 UPSERT,並在數據庫中查詢任何匹配的IDS:

+2

請將問題標記爲重複,而不是複製答案 – FelixSFD

+0

由於此問題早已解決,所以標記爲正確。 :) – mxplusb