Панды to_sql (), чтобы обновить уникальные значения в БД? - PullRequest
0 голосов
/ 05 сентября 2018

Как я могу использовать df.to_sql(if_exists = 'append') для добавления ТОЛЬКО уникальных значений между фреймом данных и базой данных. Другими словами, я хотел бы оценить дубликаты между DF и DB и удалить эти дубликаты перед записью в базу данных.

Есть ли параметр для этого?

Я понимаю, что параметры if_exists = 'append' и if_exists = 'replace' предназначены для всей таблицы, а не для уникальных записей.

I am using: 
sqlalchemy

pandas dataframe with the following datatypes: 
    index: datetime.datetime <-- Primary Key
    float
    float
    float
    float
    integer
    string <---  Primary Key
    string<----  Primary Key

Я застрял на этом, поэтому ваша помощь очень ценится. -Спасибо

1 Ответ

0 голосов
/ 05 сентября 2018

В пандах нет удобного аргумента в 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 реляционными базами данных.

...