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