1

mysqlDB を使用しようとしていますが、まったく理解できない問題に遭遇しました。

私の問題は、次の実行ステートメントのテーブル名に集中しています。

これは機能します:

c.execute(u'''insert into AIN0 (Date_Info, Raw_Data, Calculation_Formula, Calculated_Data) values (%s, %s, %s, %s)''',
                        (str(date), int(raw), int(formula), 0.1))

これらのどちらも機能しません:

c.execute(u'''insert into %s (Date_Info, Raw_Data, Calculation_Formula, Calculated_Data) values (%s, %s, %s, %s)''',
                        (str("AIN0"), str(date), int(raw), int(formula), 0.1))
c.execute(u'''insert into 'AIN0' (Date_Info, Raw_Data, Calculation_Formula, Calculated_Data) values (%s, %s, %s, %s)''',
                        (str(date), int(raw), int(formula), 0.1))

問題は、動作していないものの両方が同じエラーメッセージになるということです:

ProgrammingError: (1064、「SQL 構文にエラーがあります。''AIN0' (Date_Info、Raw_Data、Calculation_Formula、Calculated_Data) 値 ('2011') の近くで使用する正しい構文については、MySQL サーバーのバージョンに対応するマニュアルを確認してください。行 1")

エラー メッセージでは、文字列補間演算子を使用して挿入した場合でも、AIN0 が一重引用符で囲まれていることに注意してください。念のため、MySQL が何を見ているかを確認するために、動作中のケースで意図的な構文エラーを作成しました。

ProgrammingError: (1064、「SQL 構文にエラーがあります。near を使用する正しい構文については、MySQL サーバーのバージョンに対応するマニュアルを確認してください」)) AIN0 (Date_Info、Raw_Data、Calculation_Formula、Calculated_Data) の値 ('201'行 1")

案の定、MySQL が正しく動作するものでは、AIN0 が一重引用符で囲まれておらず、それがエラーの原因であると思われます。

文字列補間を使用すると、文字列の前後に単一引用符が挿入されるのはなぜですか? また、それらを停止するにはどうすればよいですか?

4

1 に答える 1

4

「文字列補間」が Python の文字列フォーマットのようなものである場合、それはあなたが使用しているものではありません。cursor.execute()独自のルール セットを持つ SQL パラメータ挿入を行います。混乱は、一部のデータベース インターフェイス (mysqlDB を含む)%sがプレースホルダーとして使用されるために発生します。他のデータベース インターフェイスは、eg を使用します。?

パラメーター化された SQL を使用する場合、SQL で式を使用できる場所にのみプレースホルダーを使用できます。テーブル名は式ではありません。引数が文字列の場合、単一引用符で囲まれるため、結果の SQL では SQL 文字列リテラルのように見えます。これには、一重引用符の二重化が含まれます。たとえば、Python では文字列リテラルとして表示されますが、SQL では become のよう"O'Brien"になり'O''Brien'ます。

したがって、一重引用符で囲むことを止めることはできません。2 つの手順を実行する必要があります: (1) AIN0Python 文字列フォーマットを使用して、必要な場所に挿入する SQL 文字列を作成します。(2) その SQL 文字列をcursor.execute()

于 2011-03-26T04:32:09.117 に答える