Вставить в таблицу postgreSQL из панд с обновлением "на конфликт" - PullRequest
0 голосов
/ 15 марта 2019

У меня есть пандас DataFrame, который мне нужно сохранить в базе данных.Вот моя текущая строка кода для вставки:

df.to_sql(table,con=engine,if_exists='append',index_label=index_col)

Это прекрасно работает, если в моей таблице нет ни одной строки в df.Если строка уже существует, я получаю эту ошибку:

sqlalchemy.exc.IntegrityError: (psycopg2.IntegrityError) duplicate key
value violates unique constraint "mypk"
DETAIL:  Key (id)=(42) already exists.
 [SQL: 'INSERT INTO mytable (id, owner,...) VALUES (%(id)s, %(owner)s,...']
 [parameters:...] (Background on this error at: http://sqlalche.me/e/gkpj)

и ничего не вставляется.

PostgreSQL имеет необязательное предложение ON CONFLICT, которое можно использовать для UPDATE существующей таблицыстрок.Я прочитал всю справочную страницу pandas.DataFrame.to_sql , и я не смог найти способ использовать ON CONFLICT в функции DataFrame.to_sql().

Я решил разделить свой DataFrame на двана то, что уже в таблице БД.Итак, теперь у меня есть два DataFrames, insert_rows и update_rows, и я могу безопасно выполнить

insert_rows.to_sql(table, con=engine, if_exists='append', index_label=index_col)

Но тогда, похоже, нет UPDATE эквивалента DataFrame.to_sql().Итак, как мне обновить таблицу с помощью DataFrame update_rows?

1 Ответ

0 голосов
/ 15 марта 2019

Если вы заметили в to_sql документах, есть упоминание аргумента method, который требует вызова. Создание этого вызова должно позволить вам использовать необходимые вам пункты Postgres. Вот пример вызова, который они упомянули в документах: https://pandas.pydata.org/pandas-docs/stable/user_guide/io.html#io-sql-method

Это довольно сильно отличается от того, что вам нужно, но следуйте аргументам, переданным этому вызываемому элементу. Они позволят вам построить обычный оператор SQL.

...