極めて簡単な方法でsqlalchemy結果セットをJSONにシーケンス化

1611 ワード

jsonを受け継ぐJSONEncoder
sqlalchemyに対する戻りタイプの処理方法を実現する.
sqlalchemyの戻りタイプには、ModelオブジェクトとQueryコレクション(一部のフィールドのみクエリー)の2種類があります.
この2つの戻り結果は、いずれも同じタイプのsqlalchemyから来ている.orm.query.Query 
だからQueryに対して対応する処理をして、彼にdictを返させます
 
class AlchemyJsonEncoder(json.JSONEncoder):
    def default(self, obj):
        #      Query
        if isinstance(obj, Query):
            #         
            fields = []
            #         
            record = {}
            #          
            for rec in obj.all():
                #         
                for field in [x for x in dir(rec) if
                              #     
                              not x.startswith('_')
                              #        
                              and hasattr(rec.__getattribute__(x), '__call__') == False
                              #          
                              and x != 'metadata']:
                    data = rec.__getattribute__(field)
                    try:
                        record[field] = data
                    except TypeError:
                        record[field] = None
                fields.append(record)
            #       
            return fields
        #                   JSON
        return json.JSONEncoder.default(self, obj)

  
これにより、シーケンス化するたびに簡単に使用できます.
json.dumps(result1, cls=AlchemyJsonEncoder)

結果セットのjsonシーケンス化を実現しました.