2

関数を呼び出してクエリを実行しようとしています:

def run(self,query):       
        try:
            self.cursor = self.conn.cursor ()
            self.cursor.execute(query)
        except MySQLdb.Error, e:
            logger.info( "Run function with query: %s Error %d: %s" % (query,e.args[0], e.args[1]))
        except:
            logger.info( "Errorin Run function with query %s" % (query))

この関数は、ほとんどのクエリでうまく機能しています。

実行しようとしているクエリが 1 つあります。

insert into NewBooks (title,WikiLink) values
   ('Five Point Someone – What not to do at IIT!',
    'http://en.wikipedia.org/wiki/Five Point Someone – What not to do at IIT!')

このクエリは例外をスローし、出力はErrorin Run function with query %s" % (query) Traceback error: Error: I am Getting is UnicodeEncodeError: 'latin-1' codec can't encode character u'\u2013' in position 120: ordinal not in range(256) です

Mysqlコマンドラインでコピーして実行すると、うまくいきました。誰かが私に何がうまくいかないのか説明してもらえますか?

4

1 に答える 1

0

そのクエリにはいくつかの特殊文字があり、デフォルトのロケールは latin-1 (iso-8859-1) です。Python がエラー メッセージを出力してクエリを含めようとすると、Unicode オブジェクトをバイトにエンコードできません (コード ポイントではなくパイプ経由でしかバイトを送信できないため、これを行う必要があります)。

utf-8 対応の端末を使用して実行し、ロケールが utf-8 対応であることを確認するか、クエリ データを出力用にエンコードする方法を明示的に指定してみてください。

その%r行で . の代わりに%s.

logger.info( "Errorin Run function with query %r" % (query,))

これは、クエリ オブジェクトを Python に貼り付けられるように表示するだけなので、特殊文字はエスケープされます。

また、表示されるはずの実際のエラーを飲み込んでしまいます。本当にそれを取り出して、Pythonにトレースバック自体を表示させるか、

import traceback
traceback.print_exc()

その最後の裸の下except:

于 2012-05-18T01:41:27.033 に答える