1

なぜこのエラーが発生するのか疑問に思っています。

cmd = "INSERT INTO resulttest (category, value, timestamp) VALUES (" + key + ", " + str(value) + ", " + str(timestamp) + ")"
c.execute(cmd)
db.commit()

    INSERT INTO resulttest (category, value, timestamp) VALUES (composed, 2, 1343186948.8)

Traceback (most recent call last):
  File "C:/Behavioral Technology/Google Drive/twitterthingv5test.py", line 94, in <module>
    moodParser()
  File "C:/Behavioral Technology/Google Drive/twitterthingv5test.py", line 92, in moodParser
    query()
  File "C:/Behavioral Technology/Google Drive/twitterthingv5test.py", line 37, in query
    main(columns)
  File "C:/Behavioral Technology/Google Drive/twitterthingv5test.py", line 81, in main
    c.execute(cmd)
  File "C:\Python27\lib\site-packages\MySQLdb\cursors.py", line 174, in execute
    self.errorhandler(self, exc, value)
  File "C:\Python27\lib\site-packages\MySQLdb\connections.py", line 36, in defaulterrorhandler
    raise errorclass, errorvalue

これは、SQLコマンドに値を渡す方法と関係があると思います。

4

2 に答える 2

4

クエリを作成するコードは、文字列値を引用しようとしていません。

cmd = "INSERT INTO resulttest (category, value, timestamp) VALUES (" + key + ", " + str(value) + ", " + str(timestamp) + ")"

印刷したSQLステートメントを見てください。

INSERT INTO resulttest (category, value, timestamp) VALUES (composed, 2, 1343186948.8)

「カテゴリ」を引用するべきではありませんか?

そもそも文字列演算を使用してSQLステートメントを作成するべきではありません。これがSQLインジェクションの脆弱性の発生方法です。代わりに、プレースホルダーを使用して、MySQLライブラリにそれらを処理させる必要があります。

c.execute(
    "INSERT INTO resulttest (category, value, timestamp) VALUES (?, ?, ?)", 
    (key, value, timestamp)
)
于 2012-07-25T03:35:44.303 に答える
0

Ned Batchelderの提案が機能しない場合は、次の方法があります。

sql = "INSERT into resulttest (category, value, timestamp) VALUES (%s, %s, %s)"
c.execute(sql % (key, value, timestamp))

SQLコマンドが実行されないという問題に直面し、この種の構文に従うと機能しました。

注意する必要がありますが、%代わりに使用,するとSQLインジェクションの可能性が広がりますが、これが私にとって有効な唯一の構文でした。Python-MySQLバージョンと互換性の問題である可能性があります。

より良いアイデアは、互換性のあるバージョンをインストールし、正しい構文に従うことです。

于 2012-07-27T10:58:44.233 に答える