2017-08-29 78 views
2

我是一個非常新的編碼,我卡住了。我正在通過api提供一個.csv文件的報告。我想將其粘貼到SQL數據庫中,但遇到了一些麻煩。Escape使用python從python寫入SQL的列名,pyodbc從csv

我當前的代碼如下所示:

閱讀器解碼後的csv文件。

columns = next(reader,None) 
query = "INSERT INTO table({0}) VALUES ({1})" 
query = query.format(','.join(columns),','.join('?'*len(columns))) 
cursor = cnxn.cursor() 
cursor.execute(query, columns) 
for data in reader: 
    cursor.execute(query, data) 
cursor.commit() 

當我運行代碼,我得到這個錯誤:

pyodbc.ProgrammingError: ('42000', "[42000] [Microsoft][ODBC Driver 13 for SQL Server][SQL Server]Incorrect syntax near the keyword 'Group'. (156) (SQLExecDirectW)")

我認爲這個問題是我的欄目有:

Date | Advertiser | Campaign | Ad Group | etc. 

它似乎也許SQL正在識別「廣告組」中的「組」作爲變量。

任何想法?謝謝。

+1

這並不是說它將它識別爲一個變量 - 而是因爲列名中的空格而無法解釋它。你需要在方括號中加上一個列名稱,以便解釋它(並且總的來說,最好將所有的列名都放在方括號中) - 所以不是'insert into table(date,廣告客戶,廣告系列,廣告組)'它應該'插入到表格([日期],[廣告客戶],[廣告系列],[廣告組]) – ZLK

+0

@ZLK非常感謝。這工作。現在看起來我的數據是以字符串形式傳遞的「轉換日期和/或字符串中的時間時轉換失敗」。是否有一個快速解決方案,以及任何機會? – Jamesdabeard

+0

嗯,這取決於你的數據是什麼樣子。日期字段是什麼樣的? – ZLK

回答

3

正如@ZLK的評論中所提到的,您需要將列名放在方括號中。這將做詭計:

query = query.format('[{0}]'.format('], ['.join(columns)),','.join('?'*len(columns))) 
+0

這隻有在列名本身不包含方括號的情況下才有效。如果你想要更安全,你還需要在動態列名稱中用']]'替換']',然後將它們放在方括號中。這將防止SQL注入並允許您在列名中包含真正的括號。 – Tim