【问题标题】:how to serializer list object in sqlalchemy?如何在 sqlalchemy 中序列化列表对象?
【发布时间】:2016-06-13 10:23:27
【问题描述】:

当我 selectall 到数据库时,我使用 jsonpickle 作为序列化程序,我将在使用 jsonpickle 时将列表对象转换为 json,我得到这个输出:

代码:

 Session = sessionmaker(bind=connect.ConnectorMySql())
                    ses = Session()
                    lst =  ses.query(pModel).all()
                    return lst

jsonpickle:

serialized_obj = jsonpickle.encode(lst[0])

输出:

{"py/object": "Models.UserModel.", "sa_instance_state": {"py/object": "sqlalchemy.orm.state.InstanceState", "py/state": {"instance": {"py/id": 0}, "committed_state": {}, "class": {"py/type": "Models.UserModel."}, "manager": {"py/object": "sqlalchemy.orm.instrumentation.SerializeManager", "class": {"py/type": "Models.UserModel.Student"}}, "key": {"py/tuple": [{"py/type": "Models.UserModel.Student"}, {"py/tuple": [1]}]}, "expired_attributes": {"py/set": []}}}, "name": "ramin", "fullname": "eee", "password": "1234345", "id": 1}

但我需要这种格式的 json:

{"name": "ramin", "fullname": "eee", "password": "1234345", "id": 1}

你对这项工作有更好的想法吗?

【问题讨论】:

  • 你能发布你的代码吗?
  • 好的,请再看一遍

标签: python django python-3.x sqlalchemy jsonpickle


【解决方案1】:

这不是jsonpickle 的用途。 picklejsonpickle 用于将任意 Python 对象序列化为某种格式,以便以后可以将其反序列化为完全相同的 Python 对象。它们不用于根据特定模式对对象进行序列化。

对于您的情况,您必须自己编写序列化逻辑。示例:

obj = lst[0]
serialized_obj = {k: getattr(obj, k) for k in ["name", "fullname", "password", "id"]}

您还必须处理任何特殊类型。您甚至可以花哨并尝试自动反映模型上的列。

顺便问一下,我看到的密码是明文存储的吗?

【讨论】:

  • 感谢您的回答,不,这是一个示例 :))),
【解决方案2】:

尝试在 SQLAlchemy 对象上定义 __getstate____setstate__,如下所示

def __getstate__(self):
    state = {}
    for k, v in self.__dict__.items():
        if k != '_sa_instance_state':
            state[k] = v
    return state

def __setstate__(self, d):
    self.__dict__ = d

jsonpickle 将使用这些来腌制/去腌制,如果我理解正确,您不会存储 _sa_instance_state 这是内部簿记。

这里有一些相关信息:http://docs.sqlalchemy.org/en/latest/orm/extensions/mutable.html#supporting-pickling

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-22
    • 2018-08-17
    • 2015-03-15
    • 1970-01-01
    • 2020-02-05
    • 1970-01-01
    • 2014-12-22
    相关资源
    最近更新 更多