sqlalchemy.ext.declarative.api.DeclarativeMeta转json

来源:互联网 发布:手机音乐闪光灯软件 编辑:程序博客网 时间:2024/06/07 06:27

原文链接: sqlalchemy.ext.declarative.api.DeclarativeMeta转json

from sqlalchemy.ext.declarative import DeclarativeMetafrom datetime import datetimeimport jsonclass AlchemyEncoder(json.JSONEncoder):    _visited_objs = []    def default(self, obj):        if isinstance(obj.__class__, DeclarativeMeta):            # don't re-visit self            if obj in AlchemyEncoder._visited_objs:                return None            AlchemyEncoder._visited_objs.append(obj)            # an SQLAlchemy class            fields = {}            for field in [x for x in dir(obj) if not x.startswith('_') and x != 'metadata']:                data = obj.__getattribute__(field)                try:                    if isinstance(data, datetime):                        data=data.strftime('%Y-%m-%d %H:%M:%S')                    json.dumps(data) # this will fail on non-encodable values, like other classes                    fields[field] = data                except TypeError:                    fields[field] = None            return fields        return json.JSONEncoder.default(self, obj)def new_alchemy_encoder():    _visited_objs = []    class AlchemyEncoder(json.JSONEncoder):        def default(self, obj):            if isinstance(obj.__class__, DeclarativeMeta):                # don't re-visit self                if obj in _visited_objs:                    return None                _visited_objs.append(obj)                # an SQLAlchemy class                fields = {}                for field in [x for x in dir(obj) if not x.startswith('_') and x != 'metadata']:                    data = obj.__getattribute__(field)                    try:                        if isinstance(data, datetime):                            data=data.strftime('%Y-%m-%d %H:%M:%S')                        json.dumps(data) # this will fail on non-encodable values, like other classes                        fields[field] = data                    except TypeError:                        fields[field] = None                return fields            return json.JSONEncoder.default(self, obj)    return AlchemyEncoder

使用

print(json.dumps(table, cls=new_alchemy_encoder(), check_circular=False))

或者

print(json.dumps(table, cls=AlchemyEncoder, check_circular=False))

table为query返回值(DeclarativeMeta类型)

0 0
原创粉丝点击