2014-05-09 147 views
9

我想将Pandas数据框追加到名为“NewTable”的sqlite数据库中的现有表中。 NewTable有三个字段(ID,Name,Age),ID是主键。我的数据库连接:通过主键将熊猫数据框添加到sqlite表中

import sqlite3 
DB='<path>' 
conn = sqlite3.connect(DB) 

我要追加数据框:

test=pd.DataFrame(columns=['ID','Name','Age']) 
test.loc[0,:]='L1','John',17 
test.loc[1,:]='L11','Joe',30 

如上所述,ID是newtable的主键。关键'L1'已经在NewTable中,但'L11'关键字不是。我尝试将数据框追加到NewT​​able。

from pandas.io import sql 
sql.write_frame(test,name='NewTable',con=conn,if_exists='append') 

这将引发一个错误:

IntegrityError: column ID is not unique 

的错误是可能的事实是关键 'L1' 已经在newtable中。数据框中的任何条目都不会附加到NewT​​able中。但是,我可以使用NewTable的新密钥附加数据框而不会出现问题。

有没有简单的方法(例如,没有循环)将Pandas数据框附加到sqlite表中,以便追加数据框中的新键,但表中已经存在的键不是?

谢谢。

+1

对于它的价值,如果你发现自己做了很多,sqlalchemy是一个很好的工具,可以与python进行交互。如果你设置了它,session.merge(row)函数将完成这个工作,用一个现有的主键替换一行,否则添加它。 – RussellStewart

+0

谢谢。我会研究sqlalchemy。 – lmart999

回答

8

您可以使用SQL功能insert or replace

query=''' insert or replace into NewTable (ID,Name,Age) values (?,?,?) ''' 
conn.executemany(query, test.to_records(index=False)) 
conn.commit() 
+0

谢谢,这个工程。次要添加:将索引从记录数组中排除以匹配表结构。 'conn.executemany(query,test.to_records(index = False))' – lmart999

+0

没错。我通常使用主键作为df中的索引,所以我忘了这一点。 – Happy001