python - 当没有这样的命名列时,SQLite 给出找不到列的错误

标签 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 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_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 尝试将数据帧的索引作为列“index”插入,但由于已经有一个名为“index”的列,它使用下一个选项,即“level_0”。但是当您追加到表中时,此列不存在。这可能是 pandas 中的一个错误,但目前有一些解决方法。

目前可能的解决方法是:

  • 指定不插入dataframe的索引:dataFrame.to_sql(...., index=False)
  • 指定应插入索引的列名(如果需要):dataFrame.to_sql(...., index_label='id')
  • 或者您可以让 to_sql 自己创建数据库表(无需追加),这样就不需要在 python 中定义表了。

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

相关文章:

python - 我可以匿名使用 boto3 吗?

php - 通过JSON写入数据库php问题

c# - 如何为来自不同公司的断开连接的系统同步两个数据库

SQLite:确保一个条目小于另一个作为约束

SQLite 表磁盘使用情况

android - 满足条件时更改列的值

python - regex.sub() 给出与 re.sub() 不同的结果

python - 如何在不按回车键的情况下输入内容

python - 是否可以将 class.__init__() 的所有输入都作为一行中的属性?

mysql - 加入多个外键