【发布时间】:2014-06-26 13:46:55
【问题描述】:
如何将 SQLAlchemy orm 对象结果转换为 JSON 格式?
目前我正在使用 sqlalchemy 反射来反映数据库中的表。 考虑我有一个用户表和一个地址表,我正在从数据库中反映出来。 用户实体与地址实体具有一对一的关系。 下面是从数据库中反映表并使用映射器类映射关系的代码。
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', metadata, autoload=True, 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)
现在,当我想将用户对象转换为 dict 我使用下面的方法
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, getattr(obj, c))
return dict(map(get_key_value, columns))
但是,如果返回的用户对象与另一个表没有关系,则 object_to_dict 方法可以正常工作并返回有效的 dic 对象。 如果用户对象具有关系,则 object_to_dict 方法不会自动扩展关系对象并将其转换为 dict。
任何人都可以建议我如何自动确定返回的用户对象是否具有关系,并将关系对象扩展为一个字典,如果它有一个,等等对于任意数量的子对象。
【问题讨论】:
标签: python json sqlalchemy