微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将SqlAlchemy ORM结果转换为dict

如何解决将SqlAlchemy ORM结果转换为dict

您可以使用映射器的Relationships属性代码选择取决于您要如何映射数据以及关系的外观。如果您有很多递归关系,则可能要使用max_depth计数器。我下面的示例使用一组关系来防止递归循环。如果您只打算深入一遍,则可以完全消除递归,但是您确实说了“依此类推”。

def object_to_dict(obj, found=None):
    if found is None:
        found = set()
    mapper = class_mapper(obj.__class__)
    columns = [column.key for column in mapper.columns]
    get_key_value = lambda c: (c, getattr(obj, c).isoformat()) if isinstance(getattr(obj, c), datetime) else (c, getattr(obj, c))
    out = dict(map(get_key_value, columns))
    for name, relation in mapper.relationships.items():
        if relation not in found:
            found.add(relation)
            related_obj = getattr(obj, name)
            if related_obj is not None:
                if relation.uselist:
                    out[name] = [object_to_dict(child, found) for child in related_obj]
                else:
                    out[name] = object_to_dict(related_obj, found)
    return out

另外,请注意,还有一些性能问题需要考虑。您可能需要使用诸如joinedload或subqueryload之类的选项,以防止执行过多的SQL查询

解决方法

如何将SQLAlchemy orm对象结果转换为JSON格式?

当前,我正在使用sqlalchemy反射来反映数据库中的表。考虑我有一个用户表和一个地址表,我正在数据库中反映。用户实体与地址实体具有一对一的关系。下面的代码反映数据库中的表并使用mapper类映射关系。

from sqlalchemy import Table
from sqlalchemy.orm import mapper,relationship
user_reflection = Table('user',metadata,autoload=True,autoload_with=engine)
class User(object):
    def __init__(self,id,name,dob):
        self.id = id
        self.name = name
        self.dob = dob
address_reflection = Table('address',autoload_with=engine)
mapper(User,user_reflection,properties={
           'address': relationship(SourceAddress,uselist=False)
       }
)

现在,当我使用sqlalchemy orm查询对象时

user = session.query(User).first()
user_dict = object_to_dict(user)

现在,当我要将用户对象转换为字典时,请使用以下方法

def object_to_dict(obj):
    columns = [column.key for column in class_mapper(obj.__class__).columns]
    get_key_value = lambda c: (c,getattr(obj,c).isoformat()) if isinstance(getattr(obj,c),datetime) else (c,c))
    return dict(map(get_key_value,columns))

但是,如果返回的用户对象与另一个表没有关系,则object_to_dict方法可以正常工作并返回有效的dic对象。如果用户对象具有关系,则object_to_dict方法不会自动扩展关系对象并将其转换为dict。

谁能建议我如何自动确定返回的用户对象是否具有关系,以及如果该关系对象具有任意数量的子对象,则将该关系对象扩展为字典。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。