在MySQL数据库中保存Python pickle对象

在MySQL数据库中保存Python pickle对象,python,mysql,django,pickle,Python,Mysql,Django,Pickle,我正在Django中处理Python对象,并将其保存在MySQL数据库中。 到目前为止,我遵循了以下简单规则: cPickle.dumps(object)#将python对象转换为pickle对象 cPickle.load(pickled_对象)#从pickled对象加载回python对象 My Django模型字段是文本字段 MySQL db字段类型为longblobAttributesbinary MySQL数据库编码是utf8\u unicode\u ci 不幸的是,我在加载python对

我正在Django中处理Python对象,并将其保存在MySQL数据库中。 到目前为止,我遵循了以下简单规则:

  • cPickle.dumps(object)
    #将python对象转换为pickle对象

  • cPickle.load(pickled_对象)
    #从pickled对象加载回python对象

  • My Django
    模型字段
    文本字段

  • MySQL db字段类型为
    longblob
    Attributes
    binary

  • MySQL数据库编码是
    utf8\u unicode\u ci

  • 不幸的是,我在加载python对象时遇到以下错误

    Type Error: ('an integer is required', <type 'datetime.date'>, ('x07xb6x0bx06',))
    
    类型错误:(“需要一个整数”(“x07xb6x0bx06”))
    
    在我看来,通过查看错误值
    x07xb6x0bx06
    这是一个编码问题。
    我错过了重要的一步吗??有谁能帮我解决这个问题吗?

    还有一条规则:使用选项
    charset=utf8连接到mysql

    UPD1: 有时查看完整的SQL查询是个好主意,我通常这样做:

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

    纽托弗的答案可能是正确的,但看看


    它确实为我节省了一些时间,并且可以存储几乎任何您想要的内容。

    如果您试图将
    cPickle.dumps
    的输出存储在
    VARCHAR
    列中,那么您的问题是您试图将字节字符串存储在字符列中。这种情况下的修复方法是将对象编码为
    unicode(base64.encode(cPickle.dumps(myobject))
    ,然后存储它

    或者:

    object2varchar = lambda obj: unicode(base64.encode(cPickle.dumps(obj)))
    store(object2varchar([1, 'foo']))
    
    你现在可以试试这个! django picklefield

    要使用,只需在模型中定义一个字段:

    >>> from picklefield.fields import PickledObjectField
    ... class SomeObject(models.Model):
    ...     args = PickledObjectField()
    
    并将您喜欢的内容(只要可拾取)分配给字段:

    >>> obj = SomeObject()
    >>> obj.args = ['fancy', {'objects': 'inside'}]
    >>> obj.save()
    

    你有使用泡菜的具体原因吗?它是二进制格式,只能由python使用。如果您有选择,JSON不是更好的选择吗?JSON不符合我的目的,我尝试使用
    JSON.dumps
    ,但出现了这个错误
    某些对象不可JSON序列化
    。对象是纯Python的。您应该尝试使该对象也可序列化。当您试图查找bug时,数据库中有人类可读的内容是一个很大的帮助。@aamir adnan,您是否尝试保存和读取一个新项目而不是读取已保存的项目?好问题,是的,我检查了它,当我在代码中转换和还原python对象时,它工作正常。读取或未正确存储时,数据库有问题。我该怎么办?请提供帮助。@aamir adhan,我的意思是前面的项目可能以错误的编码保存,现在可以正确读取noew。而不是使用Django模型(与Django模型的行为
    文本字段
    和MySQL
    blob字段
    )相混淆),i
    直接
    与数据库建立连接,并将pickle对象直接存储在数据库中。但同样的错误:-(是的,我总是更新字段,然后读取新值。我没有读取旧保存的值。