使用“on conflict”更新从pandas插入postgreSQL表

问题描述 投票:0回答:1

我有一个pandas 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 manual page,我找不到任何方法在ON CONFLICT函数中使用DataFrame.to_sql()

我已经考虑过根据db表中已有的内容将我的DataFrame分成两部分。所以现在我有两个DataFrames,insert_rowsupdate_rows,我可以安全地执行

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

但是,似乎没有相当于UPDATEDataFrame.to_sql()。那么如何使用DataFrame update_rows更新表格?

python pandas postgresql dataframe insert-update
1个回答
0
投票

如果你注意到在to_sql文档中提到了一个可以调用的method参数。创建此可调用对象应允许您使用所需的Postgres子句。这是他们在文档中提到的可调用的示例:https://pandas.pydata.org/pandas-docs/stable/user_guide/io.html#io-sql-method

它与您需要的完全不同,但请遵循传递给此callable的参数。它们将允许您构造常规SQL语句。

© www.soinside.com 2019 - 2024. All rights reserved.