2011-11-16 18 views
8

私はPythonオブジェクトをDjangoで漬け込み、MySQLデータベースに保存しています。漬け物MySQLデータベースにPython Pickledオブジェクトを保存する

  • 私のジャンゴからPythonオブジェクトをバックロードするための漬け物

  • cPickle.loads(pickled_object)#にPythonのオブジェクトを変換#to

    1. cPickle.dumps(object)Model Field: は、これまでのところ私は、これらの単純なルールに従っていますis Text Field

    2. MySQL dbフィールドタイプはlongblobです。Attrib UTES binary

    3. MySQLのDBのエンコーディングは、Pythonオブジェクトをバックロード中に残念ながら、私は次のエラーを取得していますutf8_unicode_ci

    です。

    Type Error: ('an integer is required', <type 'datetime.date'>, ('x07xb6x0bx06',)) 
    

    これはエンコーディングの問題であるエラー値x07xb6x0bx06に見ることによって、私には思えます。 私はいくつかの重要なステップを逃しましたか?誰も私がこの問題を解決するのに役立つことができますか?

  • +1

    あなたは漬物を使用する特別な理由を持っていますか?これはバイナリ形式であり、Pythonだけが使用できます。選択肢がある場合は、JSONを使用しない方が良いでしょうか? –

    +0

    JSONは私の目的をサーバーしていないので、 'json.dumps'を使用しようとしましたが、' some_objectはJSONのシリアライザブルではありません。そしてそのオブジェクトは純粋なPythonicです。 –

    +2

    そのオブジェクトを直列化可能にするようにしてください。あなたがバグを見つけようとしているときに、あなたのデータベースに人間が読めるものを持っているのは*大きな助けです。 –

    答えて

    5

    cPickle.dumpsの出力をVARCHAR列に格納しようとすると、文字列にバイト文字列を格納しようとしていることが問題です。その場合の修正は、オブジェクトをunicode(base64.encode(cPickle.dumps(myobject)))としてエンコードして保存することです。また

    object2varchar = lambda obj: unicode(base64.encode(cPickle.dumps(obj))) 
    store(object2varchar([1, 'foo'])) 
    
    1

    もう1つルール:オプションcharset=utf8を使用してmysqlに接続しますか?

    UPD1: 時には私は通常、そのように行う、完全なSQLクエリを見て良いアイデアです:

    >>> conn = MySQLdb.connect(**db_params) 
    >>> "INSERT INTO tbl VALUES (%s)" % conn.literal((your_pickled_item,)) 
    
    +0

    これは私には役に立ちません。もう一度同じエラーが発生します。 –

    +0

    @ aamir-adnan、既に保存した読書の代わりに新しい項目を保存して読もうとしましたか? – newtover

    +0

    良い質問、はい私はそれをチェックし、変換し、コード内のpythonオブジェクトを復元するときにうまくいきます。私は何をすべきか?助けてください。 –

    関連する問題