将pandas DataFrame写入sql时出现无效列名错误

Posted

技术标签:

【中文标题】将pandas DataFrame写入sql时出现无效列名错误【英文标题】:invalid column name error when writing pandas DataFrame to sql 【发布时间】:2018-02-07 17:01:24 【问题描述】:

当我尝试将数据帧写入 ms sql server 时,如下所示:

cnxn = sqlalchemy.create_engine("mssql+pyodbc://@HOST:PORT/DATABASE?driver=SQL+Server") 
df.to_sql('DATABASE.dbo.TABLENAME', cnxn, if_exists='append', index=False)

我收到以下错误:

ProgrammingError: (pyodbc.ProgrammingError) ('42S22', "[42S22] [Microsoft][ODBC SQL Server Driver][SQL Server]Invalid column name 'DateDay'. (207) (SQLExecDirectW)") [SQL: 'INSERT INTO [DATABASE.dbo.TABLENAME] ([DateDay], [ID], [Code], [Forecasted], [Lower95CI], [Upper95CI], [ForecastMethod], [ForecastDate]) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)'] [parameters: ((datetime.datetime(2017, 12, 10, 0, 0), '8496', "'IO'", 197, 138, 138, 'ARIMAX',...

似乎是列名产生了错误?它正在寻找 [DateDay] 但它找到带有 ' ' 的 'DateDay'?如何解决这个问题?

我在 windows 机器上使用 python 3.6、pandas 0.22、sqlalchemy 1.1.13 和 pyodbc 4.0.17

更新——找到解决方案:

所以我意识到我的错误在于调用数据库的表名:'DATABASE.dbo.TABLENAME',当我删除 DATABASE.dbo 时,它起作用了:

df.to_sql('TABLENAME', cnxn, if_exists='append', index=False)

【问题讨论】:

df.columns 有什么?列标题中有引号吗? 【参考方案1】:

问题是我在执行 df.to_sql 命令时添加了数据库名称,因为我已经建立了与该数据库的连接,所以不需要它。这有效:

df.to_sql('TABLENAME', cnxn, if_exists='append', index=False)

【讨论】:

【参考方案2】:

如果您在数据库表中定义的名称与您在数据框中为同一列定义的名称不同,也可能会出现此问题。例如,“items”和“itens”将不匹配,当您的脚本尝试将数据框记录到数据库中时,这将导致错误。

【讨论】:

以上是关于将pandas DataFrame写入sql时出现无效列名错误的主要内容,如果未能解决你的问题,请参考以下文章

将 Pyspark DataFrame 写入 Parquet 时出现 Py4JJavaError

将 pandas df 写入 csv 时出现 Unicode 编码错误

尝试在 Pandas Dataframe 上运行函数时出现 TypeError

尝试从 Pandas DataFrame 中的字典访问第一个值时出现浮点错误

使用 SqlAlchemy 和 cx_Oracle 将 Pandas DataFrame 写入 Oracle 数据库时加快 to_sql()

pandas如何在现有的Excel表格上新建工作表并添加dataframe