【问题标题】:Is there any way to dump a sqlalchemy orm instance to json?有没有办法将 sqlalchemy orm 实例转储到 json?
【发布时间】:2014-04-14 11:22:19
【问题描述】:

我在 python 中编写了这个函数来将对象转储到 json。使用该库是否有更好、更经过测试的方法?

def model_jsonify(self,instance):
    from sqlalchemy.orm import class_mapper , ColumnProperty
    attrs = [prop.key for prop in class_mapper(instance.__class__).iterate_properties if isinstance(prop, ColumnProperty)]

    r = dict()

    for attr in attrs :
        c = getattr(instance,attr)
        assert not c is None
        r[attr] = c

    return r

【问题讨论】:

  • 我认为你的功能已经做得很好了。到目前为止有什么缺点吗?
  • 似乎这在 [如何创建 SQLalchemy 到 JSON][1] [1] 中有所介绍:stackoverflow.com/questions/14920080/…
  • 是的,功能差不多,之前没找到

标签: python json sqlalchemy


【解决方案1】:

为了完成这个问题,我编写了这段代码。您可以查询一个简单的 ORM 对象或一个列表(查询联接时的结果)。但是您不能序列化单个字段(例如查询仅包含某些字段的连接)

def model_jsonify(self,instance):
    from sqlalchemy.orm import class_mapper , ColumnProperty
    from sqlalchemy.util import KeyedTuple

    if isinstance(instance,KeyedTuple) :
        attrs = []
        r = dict()
        for i in instance :         
            modelname = type(i).__name__.lower()
            attrs = [prop.key for prop in class_mapper(i.__class__).iterate_properties if isinstance(prop, ColumnProperty)]
            r[modelname] = dict((c, getattr(i, c)) for c in attrs)
        return r

    else :
        attrs = [prop.key for prop in class_mapper(instance.__class__).iterate_properties if isinstance(prop, ColumnProperty)]
        r = dict()
        modelname = type(instance).__name__.lower()
        r[modelname] = dict((c, getattr(instance, c)) for c in attrs)
        return r

这是我用两个查询编写的一个小测试:

purchaseorder = mi.session.query(PurchaseOrder).first()
assert purchaseorder != None

j = mi.model_jsonify (purchaseorder)
assert not j is None
assert isinstance(j,dict)

assert j['purchaseorder']['name'] == 'january'

bompurchaseorderlines = mi.session.query(BoMPurchaseOrderLine,SupplierLine).join(SupplierLine).all()
assert not bompurchaseorderlines is None

for purchaseorder in bompurchaseorderlines :
    j = mi.model_jsonify (purchaseorder)

【讨论】:

    猜你喜欢
    • 2020-10-15
    • 2019-09-15
    • 1970-01-01
    • 1970-01-01
    • 2020-05-08
    • 1970-01-01
    • 1970-01-01
    • 2017-08-07
    • 2015-04-21
    相关资源
    最近更新 更多