2017-04-25 37 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