8

sqlalchemyの結果があります

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

そして、この結果をJSONに変換したいのですが、どうすればよいですか?

4

6 に答える 6

20

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)
于 2013-02-18T03:24:17.177 に答える
2
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モジュールでダンプできます。

于 2013-02-18T03:49:33.240 に答える
1

このブログ投稿は、私が行ったソリューションを提供しました: http://blogs.gnome.org/danni/2013/03/07/generating-json-from-sqlalchemy-objects/

使用された戦略は、親クラスの sqlalchemy 列を反復処理する Base mixin に直接 .todict メソッドを含めることでした。

または、 sqlalchemy.ext.serializer を使用するNandeのアプローチ ( https://stackoverflow.com/a/19602809/837575 ) は、ワイヤ経由でデータをシリアル化しようとしているが、必ずしも json として必要としない場合にうまく機能します。 .

于 2014-01-29T00:37:06.243 に答える
1

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()
于 2013-10-26T04:27:52.080 に答える
0

@mekarpeles と @hd1 が混在しているため、この anwser を追加します。つまり、単純なJSONEncoderに委任するだけで、オブジェクトの sqlalchemy 階層を変更していません。

# 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)
于 2016-02-04T14:29:47.707 に答える
0

https://github.com/TaylorHere/PythonSerializer
上記のリンクはあなたに手を差し伸べることができます。これは、次のように、SQLクエリの結果をリストまたは辞書に単純にシリアル化できる小さなスクリプトです。

#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')})
于 2016-10-22T19:45:29.150 に答える