前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >sqlalchemy和flask-sqlalchemy查询结果转json

sqlalchemy和flask-sqlalchemy查询结果转json

作者头像
stys35
发布2019-03-12 16:54:12
5.6K0
发布2019-03-12 16:54:12
举报
文章被收录于专栏:工作笔记精华工作笔记精华

Flask-RESTful 有一个专门做这个的东西,叫 marshal_with, 具体介绍在这里:http://flask-restful.readthedocs.org/en/latest/fields.html 我一般都是用它来格式化返回值

marshal_with 实际做的只是把数据库对象转换成 dict 或者 list of dict 把 dict 转换成 json 是由 Flask-RESTful 自动完成的,不用手动调用 jsonify


如果你觉得上面的方法太麻烦,这里还有一个工具,对 Flask-RESTful 进行了扩展,其中就包括简化 marshal_with 操作(marshal.py),以及加强 json 转换功能(extend_json.py, json_encoder_manager.py)。

你可以参考下它里面的代码 (不过这个工具是针对 SQLAlchemy 的,对于 Peewee 可能需要修改一下)

https://github.com/anjianshi/flask-restful-extend

  之前为了学习Python,试着拿Flask作框架搞小网站,感觉还不错,基本就抛弃了PHP。前段时间做了一个微信小程序,想着yii框架拿来写几十个小接口是不是浪费了,就继续用flask写api了,哪想到填坑无数啊。

  Python的ORM框架就属Sqlalchemy牛逼,网上资料也多,想着和yii里面应该差不多,就拿来用了。第二天万万没想到,php里面简单的一句asArray就能解决的问题,flask_sqlalchemy居然没有解决方案,查询的结果对象无法直接JSON序列化。这期间从南到北地找,大部分解决方案都是做一个JSON.dumps的Encoder方法,来转化restult对象,无意中看见https://www.cnblogs.com/wancy86/p/6421792.html 这个帖子,说queryresult对象加入了json属性,欣喜万分,搞了一晚上也没找到这个方法。

  原文链接:https://www.cnblogs.com/eating-gourd/p/9997751.html


咳咳,正文:

  网上的方法主要问题在于只能处理result对象或model对象之一,当查询某个表全部字段时,如

代码语言:javascript
复制
1 db.session.query(User).filter().all()

  其返回User这个类的对象列表,而查询某些字段或者多表连接时,如:

 1 db.session.query(User.UserID,User.UserName).filter().all() 

  其返回result对象的列表,这两种情况下,对象的属性不同,导致很多情况下只能适应一种返回。今天趁闲着没事,把两种情况的查询结果转dict作了一下整理,封装为一个queryToDict函数,并同时支持all()返回的列表和first()返回的单个对象结果:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57

from datetime import datetime as cdatetime #有时候会返回datatime类型 from datetime import date,time from flask_sqlalchemy import Model from sqlalchemy.orm.query import Query from sqlalchemy import DateTime,Numeric,Date,Time #有时又是DateTime   def queryToDict(models):     if(isinstance(models,list)):         if(isinstance(models[0],Model)):             lst = []             for model in models:                 gen = model_to_dict(model)                 dit = dict((g[0],g[1]) for g in gen)                 lst.append(dit)             return lst         else:             res = result_to_dict(models)             return res     else:         if (isinstance(models, Model)):             gen = model_to_dict(models)             dit = dict((g[0],g[1]) for g in gen)             return dit         else:             res = dict(zip(models.keys(), models))             find_datetime(res)             return res #当结果为result对象列表时,result有key()方法 def result_to_dict(results):     res = [dict(zip(r.keys(), r)) for r in results]     #这里r为一个字典,对象传递直接改变字典属性     for r in res:         find_datetime(r)     return res def model_to_dict(model):      #这段来自于参考资源     for col in model.__table__.columns:         if isinstance(col.type, DateTime):             value = convert_datetime(getattr(model, col.name))         elif isinstance(col.type, Numeric):             value = float(getattr(model, col.name))         else:             value = getattr(model, col.name)         yield (col.name, value) def find_datetime(value):     for v in value:         if (isinstance(value[v], cdatetime)):             value[v] = convert_datetime(value[v])   #这里原理类似,修改的字典对象,不用返回即可修改 def convert_datetime(value):     if value:         if(isinstance(value,(cdatetime,DateTime))):             return value.strftime("%Y-%m-%d %H:%M:%S")         elif(isinstance(value,(date,Date))):             return value.strftime("%Y-%m-%d")         elif(isinstance(value,(Time,time))):             return value.strftime("%H:%M:%S")     else:         return ""

1

dit = dict((g[0],g[1]) for g in gen)相关代码也是之前查找资料获得,现在找不到出处了,作者可以联系我。

1

滚去学雅思了,代码写得较快,欢迎指出bug

参考资源:

[1] https://stackoverflow.com/questions/5022066/how-to-serialize-sqlalchemy-result-to-json

[2] https://segmentfault.com/q/1010000007459402/a-1020000007460322

我就是我,吃瓜的瓜

https://www.cnblogs.com/eating-gourd/p/9997751.html

(adsbygoogle = window.adsbygoogle || []).push({});

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云开发 CloudBase
云开发(Tencent CloudBase,TCB)是腾讯云提供的云原生一体化开发环境和工具平台,为200万+企业和开发者提供高可用、自动弹性扩缩的后端云服务,可用于云端一体化开发多种端应用(小程序、公众号、Web 应用等),避免了应用开发过程中繁琐的服务器搭建及运维,开发者可以专注于业务逻辑的实现,开发门槛更低,效率更高。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档