Python 当不存在这样的命名列时,SQLite给定列未找到错误

Python 当不存在这样的命名列时,SQLite给定列未找到错误,python,database,sqlite,pandas,sqlalchemy,Python,Database,Sqlite,Pandas,Sqlalchemy,我正在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

我正在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:表解析器没有名为level\u 0的列

这就是我使用sqlalchemy创建db的方式

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尝试将数据帧的索引作为列“index”插入,但由于已经有一个名为“index”的列,因此它使用下一个选项,即“level_0”。但当您附加到表中时,该列不存在。这可能是熊猫身上的一种虫子,但目前有一些解决办法

目前可能的解决办法有:

  • 指定不插入数据帧的索引:
    dataframe.to_sql(....,index=False)
  • 指定应插入索引的列名(如果需要):
    dataFrame.to\u sql(....,index\u label='id')
  • 或者您可以让
    创建数据库表本身(无附加),这样就不需要python中的表定义

如果使用第三个选项,以后如何指定主键?据我所知,sqlite不允许更改表来声明主表key@AmolAgrawal数据帧的索引(或多索引)被设置为sql中的主键,但目前还没有一种自定义方法(另请参见)