我想在数据库表中添加一行,但如果存在具有相同唯一键的行,我想更新该行.
例如,
insert into table (id, name, age) values(1, "A", 19)
Run Code Online (Sandbox Code Playgroud)
假设唯一的密钥是id,在我的数据库中有一行id = 1.在这种情况下,我想用这些值更新该行.通常这会产生错误.如果我使用insert IGNORE它将忽略错误,但它仍然不会更新.
我有一个PostgreSQL数据库.Pandas有一个'to_sql'函数,用于将数据帧的记录写入数据库.但是我没有找到任何关于如何在完成数据帧时使用pandas更新现有数据库行的文档.
目前,我可以使用pandas read_sql_table将数据库表读入数据帧.然后我根据需要处理数据.但是,我无法弄清楚如何将该数据帧写回数据库以更新原始行.
我不想要覆盖整个表格.我只需要更新最初选择的行.
我想将Pandas数据帧附加到名为"NewTable"的sqlite数据库中的现有表中.NewTable有三个字段(ID,Name,Age),ID是主键.我的数据库连接:
import sqlite3
DB='<path>'
conn = sqlite3.connect(DB)
Run Code Online (Sandbox Code Playgroud)
我要附加的数据框:
test=pd.DataFrame(columns=['ID','Name','Age'])
test.loc[0,:]='L1','John',17
test.loc[1,:]='L11','Joe',30
Run Code Online (Sandbox Code Playgroud)
如上所述,ID是NewTable中的主键.键'L1'已经在NewTable中,但键'L11'不在.我尝试将数据框附加到NewTable.
from pandas.io import sql
sql.write_frame(test,name='NewTable',con=conn,if_exists='append')
Run Code Online (Sandbox Code Playgroud)
这会引发错误:
IntegrityError: column ID is not unique
Run Code Online (Sandbox Code Playgroud)
错误可能是键'L1'已经在NewTable中.数据框中的任何条目都不会附加到NewTable.但是,我可以毫无问题地将具有新密钥的数据帧附加到NewTable.
是否有一种简单的方法(例如,没有循环)将Pandas数据帧附加到sqlite表,以便附加数据帧中的新键,但表中已存在的键不是?
谢谢.