2016-12-05 14 views
1

私はPython用の新しいusignのMySLQdbよ、私はこのコードを持っている:_mysql_exceptions.ProgrammingError:。;(1064年、「あなたは、あなたのSQL構文でエラーが発生している)

for row in csv_reader: 
    insert = """INSERT INTO %s 
       VALUES (DEFAULT, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s) """ 
    cursor.execute(insert, (nome_tabela, row[0], row[1], row[2], row[3], row[4], row[5], row[6], row[7], row[8], row[9], row[10], row[11], row[12], row[13], row[14])) 

をしかし、私は実行すると、私はこれを持っています。エラー以下:mysql_exceptions.ProgrammingError: (1064, "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''Aquecimento'\n\t\t\t\t\tVALUES (DEFAULT, 'c00010', 'Dorm1', '0.0', '0.0', '0.0', '3.4' at line 1")

私はエラーがテーブルの名前にconectedされていることを想像するんだけど、私はそれについてはよく分からない

+0

このエラーは、識別子にバッククォートの代わりに '' 'を使用したことに起因します。しかし、これをPythonでどのように処理するかはわかりません。 – Sirko

+0

通常、*識別子*(表名や列名など)にはプレースホルダを使用できません。これがネイティブのプリペアドステートメントの場合、データベースAPIはそれを拒否します。 – deceze

答えて

1

私の知る限り、mysql-pythonは、テーブル名の交換を処理しない:それは盲目的に追加しますすべての変数を引用符で囲み、SQLインジェクションを再度エスケープします。

あなたの最高の幸運は、文字列を自分で連結することですが、この場合はname_tabelaの内容に関する余分に注意する必要があります、あなたはあなたのexecute第二引数をsimplfyでき

insert = (
     "INSERT INTO %s" % name_tabela 
     + " VALUES (DEFAULT, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)" 
) 
cursor.execute(insert, (row[0], row[1], row[2], row[3], row[4], row[5], row[6], row[7], row[8], row[9], row[10], row[11], row[12], row[13], row[14])) 

ところで次のようになります。

cursor.execute(insert, row[:15]) 
# or even this if the `row` has exactly 15 values 
cursor.execute(insert, row) 
関連する問題