Pandas更改To_SQL列映射

时间:2017-06-28 19:33:47

标签: python sql-server pandas sqlalchemy

我对pd.to_sql()有一点问题。我的任务是将excel文件加载到MSSQL数据库中(导入向导不是一个选项)。我过去曾使用sqlalchemypandas一起成功,但似乎无法解决这个问题。

from sqlalchemy import create_engine
import pandas as pd

# Parameters for SQL
ServerName = "SERVER_NAME_HERE"
Database = "MY_NAME_HERE"
Driver = "driver=SQL Server Native Client 11.0"

# Create the connection
engine = create_engine('mssql+pyodbc://' + ServerName + '/' + Database + "?" + Driver)

df1=read_excel('MY_PATH_HERE')
# do my manipulations below and make sure the dtypes are correct....

#... end my manipulations
df2.to_sql('Auvi-Q_Evzio_Log', engine, if_exists='append', index=False)

ERROR:
pyodbc.ProgrammingError: ('42S22', "[42S22] [Microsoft][SQL Server Native
Client 11.0][SQL Server]Invalid column name 'Created On'. (207) 
(SQLExecDirectW)")

我的问题是数据库的架构已经设置好,无法更改。我的数据框Created On中有一列,但数据库中的列名为CreatedOn。我有一些专栏出现这个问题。有没有办法在to_sql中正确设置映射或架构?文档中有一个schema参数,但我找不到有效的示例。

我可以更改数据框的列名以匹配scehma,但我的兴趣却被偷看了。

1 个答案:

答案 0 :(得分:0)

我尝试以下方法:

db_tab_cols = pd.read_sql("select * from [Auvi-Q_Evzio_Log] where 1=2", engine) \
                .columns.tolist()

df2.columns = db_tab_cols
df2.to_sql('Auvi-Q_Evzio_Log', engine, if_exists='append', index=False)

PS此解决方案假定df2Auvi-Q_Evzio_Log表具有相同的列顺序