我在pandas和sqlalchemy的帮助下使用sqlite数据库开发解析器。我正在读取一个文件并将值分配到列中。

dataFrame = pd.read_fwf('gf1401.gam',colspecs=colspaces,skiprows=37,nrows=1764)
dataFrame.columns=['elem','index','E','J','label','glande']
dataFrame['glande']=dataFrame['glande'].map(lambda x: '%1.3f' % x)
print dataFrame.head()
engine = create_engine('sqlite:///dab.sqlite')
conn = engine.raw_connection()
dataFrame.to_sql(name='parser', con=conn, if_exists='append')

最后一行有个奇怪的错误
sqlite3.OperationalError: table parser has no column named level_0
这就是我如何使用sqlalchemy创建数据库
import sqlalchemy
from sqlalchemy import create_engine
engine = create_engine('sqlite:///dab.sqlite', echo=True)
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
from sqlalchemy import Column, Integer, String, Numeric, Float
class parser(Base):
    __tablename__ = 'parser'

    id = Column(Integer, primary_key=True)
    elem = Column(String)
    index = Column(Integer)
    E = Column(Numeric)
    J = Column(Float)
    label = Column(String)
    glande = Column(Numeric)


parser.__table__
Base.metadata.create_all(engine)

from sqlalchemy.orm import sessionmaker
Session = sessionmaker(bind=engine)

如您所见,我甚至没有一个名为level 0的列。
请帮忙。
我没有在pandas中使用id列,因为sqlite会自动插入主键的值。
我只想将数据框中的数据插入到sqlite数据库中,并添加一个可以充当主键的列

最佳答案

问题在于您已经拥有的索引列。pandas试图将dataframe的索引作为列“index”插入,但由于已经有一个名为“index”的列,所以它使用了下一个选项,即“level_0”。但是当您追加到表中时,此列不存在。可能这是熊猫身上的一只虫子,但现在有一些解决办法。
目前可能的解决办法是:
指定不插入数据帧的索引:dataFrame.to_sql(...., index=False)
指定要插入索引的列名(如果需要):dataFrame.to_sql(...., index_label='id')
或者您可以让to_sql创建数据库表本身(不追加),这样就不需要python中的表定义。

关于python - 没有这样的命名列时,SQLite给列未找到错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28908686/

10-16 04:22