4

dict実行した後にデータベースに保存しようとしている単純なオブジェクトがありますpickle。Django はこのエラーをエンコードしようとしないようです。私はMySQLで確認しましたが、エラーがスローされる前にクエリがそこに到達していないため、それが問題だとは思いません. dict私が保存しているのは次のようになります。

{
    'ordered': [
        {   'value': u'First\xd1ame Last\xd1ame',
            'label': u'Full Name' },
        {   'value': u'123-456-7890',
            'label': u'Phone Number' },
        {   'value': u'user@nowhere.org',
            'label': u'Email Address' } ],
    'cleaned_data': {
        u'Phone Number': u'123-456-7890',
        u'Full Name': u'First\xd1ame Last\xd1ame',
        u'Email Address': u'user@nowhere.org' },
    'post_data': <QueryDict: {
        u'Phone Number': [u'1234567890'],
        u'Full Name_1': [u'Last\xd1ame'],
        u'Full Name_0': [u'First\xd1ame'],
        u'Email Address': [u'user@nowhere.org'] }>,
    'user': <User: itis>
}

スローされるエラーは次のとおりです。

「utf8」コーデックは位置 52 ~ 53 のバイトをデコードできません: 無効なデータです。

位置 52-53 は、\xd1ピクルされたデータ内の (Ñ) の最初のインスタンスです。

これまで、StackOverflow を掘り下げて、オブジェクトのデータベース エンコーディングが間違っているといういくつかの質問を見つけました。MySQL クエリがまだないため、これは役に立ちません。これは、データベースの前に発生しています。また、ピクルス化されたデータの Unicode エラーを検索する際にも、Google はあまり役に立ちませんでした。

Ñ を使用しない場合、このコードは問題なく動作することはおそらく言及する価値があります。

4

3 に答える 3

5

@prometheus のおかげで、これに対する解決策が見つかりました。pickle.dumps()基本的に、データベースにプラグインする前に、base64 を使用して出力をエンコードできます。次に、base64 を使用して、データベースの出力をデコードしてから に渡しますpickle.loads()

私のコードは次のようになります。

## Put the information into the database:
self.raw_data = base64.b64encode(pickle.dumps(data))

## Get the information out of the database:
return pickle.loads(base64.b64decode(self.raw_data))

繰り返しになりますが、@prometheus に感謝します。

于 2010-03-29T17:01:46.997 に答える
2

これは既知の問題であり、 Pythonバグトラッカーでこれについての議論がありました:

私は今日、Pythonデータ構造をデータベースに書き込むときにこの問題に遭遇しました。この状況ではASCIIのみが安全です。プロトコル0はASCIIのみであるというPythonのドキュメントを理解しました。

現在、pickle + base64を使用していますが、これによりデバッグがより困難になります。

とにかく、Pythonの世界ではこれが重要であるため、プロトコル0はASCIIのみではないことをドキュメントに明確に記載する必要があると思います。たとえば、Djangoが入力を使用して暗黙的なunicode()変換を行い、非ASCIIで失敗するため、この問題が発生しました。

于 2010-03-26T22:30:06.357 に答える
1

そうする必要はないと思います。通常、任意のバイナリデータをデータベースに保存できるはずです。

A worse problem is that pickling is not safe - if the database could get its data from anywhere, it could get malicious pickling data.

于 2011-07-27T19:30:12.643 に答える