使用pandas to_sql保存未定义的表列时出现问题

时间:2017-04-25 09:49:02

标签: python sqlite pandas

我想使用pandas将表格数据保存到sqlite数据库中。我在数据库中定义了一组最小列,但希望能够保存其他列。我遇到的问题是

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

我期待第一次插入表中的数据,这两个选项的行为方式相同。我想"追加"数据库中的新数据,因为我希望以后可以使用更多数据返回数据库,但这个问题给我带来了麻烦。这是一个不需要的功能,还是应该这样?

1 个答案:

答案 0 :(得分:0)

这不是一个错误。 DataFrame.to_sql(..., if_exists='append')尝试将DataFrame中的行插入到现有表中,因此如果该表具有3列,而DataFrame有4列,则会收到该预期错误,因为SQLite只需要三列。

换句话说,if_exists='append'允许您追加行,而不是列。

作为一种解决方法,您可以先向SQLite表添加一列(手动,使用SQLAlchemy等),然后您可以使用DataFrame.to_sql(..., if_exists='append')方法。

<强>更新

对现有表格进行演示:

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