2017-08-29 62 views
2

私はコーディングにかなり新しいです。私は.csvファイルを提供するAPIを介してレポートを取得しています。私はこれをSQLデータベースに貼り付けたいが、いくつかの問題が発生している。エスケープPythonでSQLに書き込むカラム名、csvからpyodbc

私の現在のコードは次のようになります。

読者は、デコードされたcsvファイルです。

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が認識しているようだ私は、コードを実行すると

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() 

は、私はこのエラーを取得します変数としての「広告グループ」の「グループ」。

アイデア?ありがとうございました。

+1

変数として認識しているわけではありません。列名のスペースのために解釈できないということです。 SQL Serverがそれを解釈するには、そのようなカラム名を大括弧で囲む必要があります(そして、大抵の場合、角カッコですべてのカラム名を囲むことをお勧めします)。したがって、 'insert into table (広告主、キャンペーン、広告グループ) 'それはテーブルに挿入する必要があります([日付]、[広告主]、[キャンペーン]、[広告グループ])' – ZLK

+0

@ZLKありがとうございます。それはうまくいった。今、私のデータが文字列として来ているように見える "文字列から日付や時間を変換すると変換に失敗しました。"万一チャンスがあってもすぐに修正できますか? – Jamesdabeard

+0

ええと、それはあなたのデータがどのように見えるかによって異なります。日付フィールドはどのように見えますか? – ZLK

答えて

3

@ ZLKのコメントで述べたように、カラム名は角括弧で囲む必要があります。

+0

これは、カラム名に大括弧が含まれていない場合にのみ機能します。より安全にしたい場合は、動的列名の中で ']'を ']]'に置き換えてから、それらを大括弧で囲む必要があります。これにより、SQLインジェクションが防止され、列名に真正括弧を付けることができます。 – Tim

関連する問題