1. ホーム
  2. python

[解決済み] FlaskでSQLAlchemyの結果セットをjsonifyする [重複].

2022-06-14 04:51:28

質問

Flask/PythonでSQLAlchemyの結果セットをjson化しようとしています。

Flaskのメーリングリストでは、以下の方法が提案されていました。 http://librelist.com/browser//flask/2011/2/16/jsonify-sqlalchemy-pagination-collection-result/#04a0754b63387f87e59dda564bde426e :

return jsonify(json_list = qryresult)

しかし、以下のようなエラーが返ってきます。

TypeError: <flaskext.sqlalchemy.BaseQuery object at 0x102c2df90> 
is not JSON serializable

私はここで何を見落としているのでしょうか?

こんな質問を見つけました。 SqlAlchemyの結果をJSONにシリアライズする方法は? という質問を見つけました。これは非常によく似ていますが、メーリングリストの投稿が示唆するように、Flaskがこれを簡単にする魔法を持っているかどうかは分かりませんでした。

編集:明確化のために、私のモデルは次のようになります。

class Rating(db.Model):

    __tablename__ = 'rating'

    id = db.Column(db.Integer, primary_key=True)
    fullurl = db.Column(db.String())
    url = db.Column(db.String())
    comments = db.Column(db.Text)
    overall = db.Column(db.Integer)
    shipping = db.Column(db.Integer)
    cost = db.Column(db.Integer)
    honesty = db.Column(db.Integer)
    communication = db.Column(db.Integer)
    name = db.Column(db.String())
    ipaddr = db.Column(db.String())
    date = db.Column(db.String())

    def __init__(self, fullurl, url, comments, overall, shipping, cost, honesty, communication, name, ipaddr, date):
        self.fullurl = fullurl
        self.url = url
        self.comments = comments
        self.overall = overall
        self.shipping = shipping
        self.cost = cost
        self.honesty = honesty
        self.communication = communication
        self.name = name
        self.ipaddr = ipaddr
        self.date = date

どのように解決するのですか?

クエリが実行されていないようです。以下を試してみてください。

return jsonify(json_list = qryresult.all())

[編集]をクリックします。 : jsonifyの問題は、通常、オブジェクトは自動的にjsonifyできないことです。Pythonのdatetimeでさえも失敗します ;)

私が過去に行ったことは、追加のプロパティ(例えば serialize のような)追加のプロパティをシリアライズされる必要のあるクラスに追加することです。

def dump_datetime(value):
    """Deserialize datetime object into string form for JSON processing."""
    if value is None:
        return None
    return [value.strftime("%Y-%m-%d"), value.strftime("%H:%M:%S")]

class Foo(db.Model):
    # ... SQLAlchemy defs here..
    def __init__(self, ...):
       # self.foo = ...
       pass

    @property
    def serialize(self):
       """Return object data in easily serializable format"""
       return {
           'id'         : self.id,
           'modified_at': dump_datetime(self.modified_at),
           # This is an example how to deal with Many2Many relations
           'many2many'  : self.serialize_many2many
       }
    @property
    def serialize_many2many(self):
       """
       Return object's relations in easily serializable format.
       NB! Calls many2many's serialize property.
       """
       return [ item.serialize for item in self.many2many]

そして今、私ができることは、viewsです。

return jsonify(json_list=[i.serialize for i in qryresult.all()])

これが役に立つといいのですが ;)

[2019年版を編集する】をご覧ください。] : より複雑なオブジェクトや循環参照を使用する場合は、以下のようなライブラリを使用します。 マシュマロ ).