繁体   English   中英

如何创建sqlalchemy到json

[英]How to create sqlalchemy to json

我有一个sqlalchemy结果

labels = session.query(
         LabelsData, 
         LabelsData.id, 
         LabelsData.name, 
         LabelsData.color
         ).filter(LabelsData.deleted==False).all()

我想将此结果转换为JSON,但我该怎么做呢?

看起来您的LabelsData对象是SQLAlchemy模型。 您需要在将其转储到JSON之前对其进行序列化。 这是一个简短的示例,它从LabelsData对象中提取所有列,并将查询结果转换为JSON:

from json import dumps
from sqlalchemy.orm import class_mapper

def serialize(model):
  """Transforms a model into a dictionary which can be dumped to JSON."""
  # first we get the names of all the columns on your model
  columns = [c.key for c in class_mapper(model.__class__).columns]
  # then we return their values in a dict
  return dict((c, getattr(model, c)) for c in columns)

# we can then use this for your particular example
serialized_labels = [
  serialize(label)
  for label in session.query(LabelsData).filter(LabelsData.deleted == False)
]
your_json = dumps(serialized_labels)
from collections import OrderedDict

class DictSerializable(object):
    def _asdict(self):
        result = OrderedDict()
        for key in self.__mapper__.c.keys():
            result[key] = getattr(self, key)
        return result

这里出现需要simplejson 希望有帮助......

更新:第二次看,它是一个字典,您可以通过python中的任何json模块进行转储。

看起来像sqlalchemy已经有一个http://docs.sqlalchemy.org/en/latest/core/serializer.html

from sqlalchemy.ext.serializer import loads, dumps
metadata = MetaData(bind=some_engine)
Session = scoped_session(sessionmaker())

# ... define mappers

query = Session.query(MyClass).filter(MyClass.somedata=='foo').order_by(MyClass.sortkey)

# pickle the query
serialized = dumps(query)

# unpickle.  Pass in metadata + scoped_session
query2 = loads(serialized, metadata, Session)

print query2.all()

这篇博客文章提供了我使用的解决方案: http//blogs.gnome.org/danni/2013/03/07/generating-json-from-sqlalchemy-objects/

使用的策略是将.todict方法直接包含在Base mixin中,该方法遍历父类的sqlalchemy列。

另外, 南德的做法( https://stackoverflow.com/a/19602809/837575 )使用sqlalchemy.ext.serializer效果很好,如果你试图序列通过有线的数据,但不一定需要它作为JSON 。

我添加这个anwser,因为它是@mekarpeles和@ hd1的混合。 我的意思是我没有修改sqlalchemy对象的层次结构,只是委托给一个简单的JSONEncoder

# given that you have 
Base = declarative_base()

class SqlAlchemyModelEncoder(json.JSONEncoder):
    def default(self, obj):
        if isinstance(obj, Base):
            result = OrderedDict()
            for key in obj.__mapper__.c.keys():
                result[key] = getattr(obj, key)
            return result
        return json.JSONEncoder.default(self, obj)

如果您的模型不使用可序列化的类(例如datetime),则必须将它们添加到Encoder中:

if isinstance(obj, datetime):
    return obj.isoformat()

然后我将它与jinja2上下文过滤器一起使用:

@contextfilter
def tojson(ctx, model, *elements, **kw):
    return json.dumps(model, cls=SqlAlchemyModelEncoder)

https://github.com/TaylorHere/PythonSerializer
上面的链接可以帮到你,这是一个小脚本,可以简单地将sql查询结果序列化为list或dict,就像这样:

#Useage with flask and SQLalchemy
from serializer import serializer
def my_location():
    if request.method == 'GET':
        user = db_session.query(User).filter(
        User.openid == session['user_id']).first()
        addresses = user.addresses
        return jsonify({'data': serializer(addresses.instance, 'sqlalchemy')})

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM