2016-07-25 2 views
2

Я работаю над массовым увеличением количества данных в PostgreSQL с помощью SQLAlchemy 1.1.0b, и у меня возникают дублирующиеся ключевые ошибки.Bulk upsert with 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_table как Table() объекта, либо.

Я работаю с данными временных рядов, поэтому я захватываю данные навалом с некоторым перекрытием во временных диапазонах. Я хочу сделать массовое обновление для обеспечения согласованности данных.

Каков наилучший способ для массового upsert с большим набором данных? Я знаю PostgreSQL support upserts, но я не уверен, как это сделать в SQLAlchemy.

+3

Возможного дубликат [SQLAlchemy - выполнение объемной upsert (если он существует, update, else insert) в postgresql] (http://stackoverflow.com/questions/25955200/sqlalchemy-performing-a-bulk-upsert-if-exists-update-else-insert-in-postgr) – FelixSFD

+0

Возможный дубликат [ Как запустить UPSERT (MERGE, INSERT ... ON DUPLICATE UPDATE) в PostgreSQL?] (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».

Альтернатива, чтобы получить список первичных ключей вы хотели бы upsert, и запрос к базе данных для каких-либо согласующих идентификаторов:

+2

Пожалуйста, отметьте этот вопрос как дубликат вместо копирования ответа – FelixSFD

+0

Правильная маркировка, так как эта проблема решена долго. :) – mxplusb