2014-05-09 220 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