我有一个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_rows
和update_rows
,我可以安全地执行
insert_rows.to_sql(table, con=engine, if_exists='append', index_label=index_col)
但是,似乎没有相当于UPDATE
的DataFrame.to_sql()
。那么如何使用DataFrame update_rows
更新表格?
如果你注意到在to_sql
文档中提到了一个可以调用的method
参数。创建此可调用对象应允许您使用所需的Postgres子句。这是他们在文档中提到的可调用的示例:https://pandas.pydata.org/pandas-docs/stable/user_guide/io.html#io-sql-method
它与您需要的完全不同,但请遵循传递给此callable的参数。它们将允许您构造常规SQL语句。