В пандах нет удобного аргумента в to_sql
для добавления только не дубликатов в финальную таблицу. Подумайте об использовании промежуточной временной таблицы, которую pandas всегда заменяет, а затем выполните последний запрос на добавление, чтобы перенести записи временной таблицы в окончательную таблицу с учетом только уникальных PK с помощью предложения NOT EXISTS
.
engine = sqlalchemy.create_engine(...)
df.to_sql(name='myTempTable', con=engine, if_exists='replace')
with engine.begin() as cn:
sql = """INSERT INTO myFinalTable (Col1, Col2, Col3, ...)
SELECT t.Col1, t.Col2, t.Col3, ...
FROM myTempTable t
WHERE NOT EXISTS
(SELECT 1 FROM myFinalTable f
WHERE t.MatchColumn1 = f.MatchColumn1
AND t.MatchColumn2 = f.MatchColumn2)"""
cn.execute(sql)
Это будет решение ANSI SQL, не ограниченное специфичными для поставщика методами, такими как UPSERT
, и поэтому совместимо практически со всеми интегрированными в SQL реляционными базами данных.