2017-04-25 42 views
-1

我想使用熊貓將表格數據保存到sqlite數據庫中。我在數據庫中定義了一組最小的列,但希望允許保存其他列的可能性。我遇到的問題是,與使用熊貓保存未定義表列的問題to_sql

with sqlite3.connect(dbname) as cnx: 
    df.to_sql("InboundOrders", cnx, if_exists='replace', index=False) 

我可以保存更多的列,例如未定義的名爲「說明」的列。當使用「添加」選項

with sqlite3.connect(dbname) as cnx: 
    df.to_sql("InboundOrders", cnx, if_exists='append', index=False) 

我得到通常sqlite的錯誤:

sqlite3.OperationalError: table InboundOrders has no column named Description 

我期待,對於第一數據插入到表中,這兩個選擇都具有相同的行爲方式。我希望將新數據「附加」到數據庫中,因爲我希望稍後能夠回收更多數據,但這個問題正在給我帶來麻煩。這是一個不需要的功能,還是應該是這樣?

回答

0

這不是一個錯誤。 DataFrame.to_sql(..., if_exists='append')嘗試將DataFrame中的行插入到現有表中,因此如果該表具有實例3列並且DataFrame包含4列,那麼您將收到預期的錯誤,因爲SQLite只需要三列。

換句話說,if_exists='append'允許您追加行,而不是列。

作爲解決方法,您可以先向SQLite表添加一列(手動使用SQLAlchemy等),然後您可以使用DataFrame.to_sql(..., if_exists='append')方法。

UPDATE:

演示了不存在的表:

In [68]: cnx = sqlite3.connect('c:/temp/a.db') 

In [69]: df 
Out[69]: 
    binary text1 text2 text3 
0  1 hello this table 
1  1 cider that chair 
2  0  bee  how mouse 
3  0 winter bottle fan 

In [70]: df.to_sql('test_replace', cnx, if_exists='replace') 

In [71]: df.to_sql('test_append', cnx, if_exists='append') 

In [72]: pd.read_sql('select * from test_replace', cnx) 
Out[72]: 
    index binary text1 text2 text3 
0  0  1 hello this table 
1  1  1 cider that chair 
2  2  0  bee  how mouse 
3  3  0 winter bottle fan 

In [73]: pd.read_sql('select * from test_append', cnx) 
Out[73]: 
    index binary text1 text2 text3 
0  0  1 hello this table 
1  1  1 cider that chair 
2  2  0  bee  how mouse 
3  3  0 winter bottle fan 
+0

我理解其中的邏輯。然而,我發現奇怪的是,如果表格還不存在(就像我的情況那樣),這兩個選項將返回不同的行爲。第一次填滿桌子時,是不是希望他們表現得相同? – famargar

+0

請注意,我重新說明了這個問題,使我的用例更清晰 – famargar

+0

@famargar,我不能再現由您的行爲描述爲不存在的表。如果表格不存在,這兩個選項都可以正常工作 – MaxU