1

質問

%sMySQL パッケージを使用した Python スクリプトでエスケープ シーケンスが機能しないのはなぜですか?

背景とコード

次の行に問題があります。

cursor.execute("""INSERT INTO `%s` (Date, Counter_in, Counter_out, Interface_name) VALUES (CURRENT_TIMESTAMP, %s, %s, %s)""", (Equipment, In_Octets, Out_Octets, interface))

次のエラー メッセージが表示されます。

Traceback (most recent call last):
  File "SNMP_Query.py", line 41, in <module>
    cursor.execute("""INSERT INTO `%s` (Date, Counter_in, Counter_out, Interface_name) VALUES (CURRENT_TIMESTAMP, %s, %s, %s)""", (Equipment, In_Octets, Out_Octets, interface))
  File "/usr/lib/pymodules/python2.6/MySQLdb/cursors.py", line 166, in execute
    self.errorhandler(self, exc, value)
  File "/usr/lib/pymodules/python2.6/MySQLdb/connections.py", line 35, in defaulterrorhandler
    raise errorclass, errorvalue
_mysql_exceptions.ProgrammingError: (1146, "Table 'Sipartech.'itx6-f10-1'' doesn't exist")

私はテーブルを再確認しましたがitx6-f10-1、実際に存在します。

4

1 に答える 1

1

挿入クエリで気付く間違いの 1 つはDate、列名を ( ` ) 記号なしで記述していることです。日付はMySQL の日付型:キーワードです。だから、あなたのクエリで:-

cursor.execute("""INSERT INTO `%s` (Date, Counter_in, 
                                    ^

する必要があります

cursor.execute("""INSERT INTO `%s` (`Date`, `Counter_in`,                    
                                     ^ added (`)

次に、MySQL:1146 エラーの理由がわかりませんでした。データベースファイルが見つからない場合に発生します。
お気づきのように、コード内の Python 変数 %sからデータベース名を見つける方法です。Equipment

しかし、なぜあなたは得ているのですか:

  'Sipartech.'itx6-f10-1''
             ^          ^  extra '  

もちろん、これをデータベース名にすることはできず、これが mysql error:1146 の理由である可能性があります。次のようになります。

 'Sipartech.itx6-f10-1'  

コードとクエリを確認してください。

また、 に疑問がある場合は、の代わりに function を%s使用できます。お気に入り:string.formate()%s

      """  
      INSERT INTO {0} ( `Date`, 
                        `Counter_in`, 
                        `Counter_out`, 
                        `Interface_name`) 
       VALUES (CURRENT_TIMESTAMP, {1}, {2}, {3})
       """.formate(Equipment, In_Octets, Out_Octets, interface))  

また、整数でないIn_Octets, Out_Octets, interface場合は、クエリ文字列の 各中かっこを囲むことを忘れないでください。'{}

于 2013-03-24T16:23:20.873 に答える