2017-06-28 136 views
0

我有一個關於pd.to_sql()的輕微問題。我的任務是將excel文件加載到MSSQL數據庫中(導入嚮導不是選項)。我在過去成功使用了sqlalchemy以及pandas,但似乎無法解決這個問題。熊貓更改To_SQL列映射

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,但我的興趣已被偷窺,否則。

回答

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此解決方案假定df2有列的順序相同Auvi-Q_Evzio_Log

+0

當我運行'db_tab_cols'我得到'sqlalchemy.exc。編程錯誤:(pyodbc.ProgrammingError)('42000',「[42000] [Microsoft] [SQL Server Native Client 11.0] [SQL Server]' - '附近的語法不正確,'它在'Auvi-Q ''特殊字符'\\''也不會修復,但是如果我只是加載整個表db_tab_cols = pd.read_sql(「Auvi-Q_Evzio_Log」,引擎).columns.tolist()'它的工作原理?給出了嗎?其次,t嘿不是同一長度'ValueError:長度不匹配:期望軸有41個元素,新值有45個元素'。有任何想法嗎? – MattR

+0

@MattR,SQL Server數據庫中的真實表名是什麼? – MaxU

+0

Auvi-Q_Evzio_Log。或者更精確[dbo]。[Auvi-Q_Evzio_Log]。編輯:使用全名作品...但顯然仍然是長度不匹配:) – MattR