pickle转换中丢失的元组?(SqlAlchemy->Redis->Pickle)

pickle转换中丢失的元组?(SqlAlchemy->Redis->Pickle),sqlalchemy,pickle,Sqlalchemy,Pickle,这是一个棘手的问题 我有两个VM的debian和lubuntu,两个框都运行相同的代码,我从mysql中提取一些数据并将其作为一个pickle对象。这里的一切都很好,问题是,当提取这些信息并通过jsonify flask响应时,这两个框的结果是不同的…我知道,不是一个代码问题…或者是实际上,我已经挠头好几个小时了,可能在这个过程中掉了一些头发,不知道我做错了什么,我会责怪发行版的不同python版本在这两个版本中是相同的,虽然lubuntu有一个更大的sqlalchemy版本,但我对此并不乐观,

这是一个棘手的问题

我有两个VM的debian和lubuntu,两个框都运行相同的代码,我从mysql中提取一些数据并将其作为一个pickle对象。这里的一切都很好,问题是,当提取这些信息并通过jsonify flask响应时,这两个框的结果是不同的…我知道,不是一个代码问题…或者是实际上,我已经挠头好几个小时了,可能在这个过程中掉了一些头发,不知道我做错了什么,我会责怪发行版的不同python版本在这两个版本中是相同的,虽然lubuntu有一个更大的sqlalchemy版本,但我对此并不乐观,因为我从两个响应中提取了一个值,它的键改变了查询..全部用于query.first并添加了logger.debugresponse.id

这里可能会回答一些上升的问题…我将查询响应进行了pickle处理,以便将其存储在redis中,这样我就可以缓存这些数据集,而不是不断地访问数据库。我不想提前讨论这个主题以避免一些混乱,我这样做的原因是保持keyedtuple的原样,而不是返回一个丑陋的字符串

 # here happens the query
 try:
    connection = create_session(engine)
    vendor_ = Table('vendor',MetaData(engine),autoload=True)
    result  = pickle.dumps(connection.query(vendor_).all())
    connection.close()
在视图中,这是我获取信息的方式:

def all_vendor():
    response = pickle.loads(controls.vendor.all_vendor(True))
    return jsonify(vendors=response)
Debian框中的响应:

卢本图的答复是:


奇怪吧?以前有人经历过吗?如果是的话,你是如何修复的?

仍然没有答案。好吧,这是一个库的东西。strace没有像我想的那样提供帮助,虽然不是专家,但在分解整个过程后,SQLAlchemy在不同的发行版上检索到的结果不一样;在获取之前必须检查pickle、flask和redis假设ORM是罪魁祸首。 不知道它们之间的主要区别,在任何情况下,最简单的解决方案是在将数据推送到jsonify之前映射整个结果集。这并不好,因为它占用了更多的资源,但至少可以防止混乱。 它在Debian最新版本Ubuntu14.10中运行正常。 没有工作:Lubuntu 14.10,Debian stable,Centos 7


就是这样。我不再深入探讨这个问题。

不知道为什么会发生这种情况,但您可以将JSON保存到Redis吗?或者使用JSON pickle。此外,我想您可能会看到是否指定了它的更改。出于某种原因,我不会将JSON直接存储到Redis;我不愿意存储哈希或字符串,这意味着添加一个额外的层r除此之外,我正在处理流的最后一部分的JSON。不过,我会阅读规范,现在我最好的办法是用不同的发行版从头开始创建另一个VM,并尝试重现这个问题:-
{
    "vendors":[
        {
            "id": 9, 
            "name": "TEST", 
            "contact": "TEST", 
            "phone": "888888", 
            "email": "test@mail.test"
        }
    ]
}
{
    "vendors": [
        [
            9, 
            "TEST", 
            "TEST", 
            "888888", 
            "test@mail.test"
        ]
    ]
}