flask_sqlalchemy 查询结果转dict 终极解决方案
之前为了学习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对象之一,当查询某个表全部字段时,如
1 db.session.query(User).filter().all()
其返回User这个类的对象列表,而查询某些字段或者多表连接时,如:
1 db.session.query(User.UserID,User.UserName).filter().all()
其返回result对象的列表,这两种情况下,对象的属性不同,导致很多情况下只能适应一种返回。今天趁闲着没事,把两种情况的查询结果转dict作了一下整理,封装为一个queryToDict函数,并同时支持all()返回的列表和first()返回的单个对象结果:
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 ""
dit = dict((g[0],g[1]) for g in gen)相关代码也是之前查找资料获得,现在找不到出处了,作者可以联系我。
滚去学雅思了,代码写得较快,欢迎指出bug
参考资源:
[1] https://stackoverflow.com/questions/5022066/how-to-serialize-sqlalchemy-result-to-json
[2] https://segmentfault.com/q/1010000007459402/a-1020000007460322
flask_sqlalchemy 查询结果转dict 终极解决方案的更多相关文章
- Fiddler无法抓取HTTPS的问题,Fiddler证书无法安装终极解决方案,
win7下Fiddler证书安装之后,总是无法抓取https的包:网上搜了很多方法都没解决问题,最终摸索解决方法如下: 第一步: 安装证书:到Fiddler的Tools-options-https下, ...
- PHP防止sql语句注入终极解决方案(包含pdo各种操作使用实例)
PHP防止sql语句注入终极解决方案完美解决方案就是使用拥有Prepared Statement机制(预处理sql)的PDO //先做个实验 先不用预处理sql写法<pre><?ph ...
- Sqlite && EF Code FIRST 终极解决方案 2019.5.17
Sqlite && EF Code FIRST 终极解决方案 2019.5.17 包括根据模型自动生成数据库,初始化数据,模型改变时的自动数据迁移等 2019.12.25 更新 支持E ...
- php中文乱码问题的终极解决方案汇总
乱码是我们在开发可能经常遇见,也是最让人头疼的一个问题了,下面这篇文章主要介绍了在php开发中,可能遇见中文乱码问题的终极解决方案,文中介绍好几个情况下的解决方法,需要的朋友可以参考借鉴,下面来一起看 ...
- Eclipse不自动编译java文件的终极解决方案
最近我的eclipse经常犯傻,项目中总是有很多,启动项目也是没有启动类.查了下项目中生成的class文件,我靠竟然没有,或者还是以前的.原来是eclipse犯傻了,它没帮我自动编译java文件.一般 ...
- 【转】JSP中文乱码问题终极解决方案
原文地址:http://blog.csdn.net/beijiguangyong/article/details/7414247 在介绍方法之前我们首先应该清楚具体的问题有哪些,笔者在本博客当中论述的 ...
- Xcode-调试断点不能停在代码区终极解决方案
转发 调试断点不能停在代码区终极解决方案: http://mobile.51cto.com/iphone-390082.htm
- VIM、GVIM在WINDOWS下中文乱码的终极解决方案
文章转自:http://www.liuhuadong.com/archives/68 vim.gvim在windows下中文乱码的终极解决方案在windows下vim的中文字体显示并不好,所以我们需要 ...
- Android大图片裁剪终极解决方案(上:原理分析)
转载声明:Ryan的博客文章欢迎您的转载,但在转载的同时,请注明文章的来源出处,不胜感激! :-) http://my.oschina.net/ryanhoo/blog/86842 约几个月前,我正 ...
随机推荐
- NOIP 模拟 $14\; \text{抛硬币}$
题解 \(by\;\;zj\varphi\) 签到题,自己看题解 Code #include<bits/stdc++.h> #define ri register signed #defi ...
- 多线程之旅(9)_如何安全的取消正在执行的线程——附C#源码
参考网址: https://blog.csdn.net/yangwohenmai1/article/details/90404497 当线程能流畅安全的自动运行后,我们就要考虑一些更风骚的操作,就是如 ...
- 【spring】spring 核心注解
注解具体分类如下: 1.模式注解 @Repository 数据仓储模式注解 @Component 通用组件模式注解 @Service ...
- 【版本管理工具】git的介绍及常用命令总结
1 git简介 1.1 git是什么? "Git 是一个分布式版本控制软件,与CVS.Subversion一类的集中式版本控制工具不同,它采用了分布式版本库的作法,不需要服务器端软件,就可 ...
- C 静态存储动态存储
首先,我们可以把程序所占的内存空间分为三个部分:(可以根据静态资源区.栈区.堆区来划分) 静态存储:程序运行期间由系统分配固定得到存储空间(栈): 动态存储:开发者根据自身需要进行动态分配的存储空间( ...
- win10 安装mysql5.7 【自定义安装路径】
- Redis3.0.0集群一键脚本 -by古斌
下载地址(以交由码云托管): https://gitee.com/gubin0412/Redis3.0.0 赋予脚本执行权限 chmod +x redis-gubin.sh 使用 ./redis-g ...
- 二 MongoDB数据类型和$type操作符
一.MongoDB中可以使用的类型如下表所示 二.$type操作符 举个例子:想获取指定集合中title为String类型的所有文档
- git cherry-pick 教程
转自:http://www.ruanyifeng.com/blog/2020/04/git-cherry-pick.html 对于多分支的代码库,将代码从一个分支转移到另一个分支是常见需求. 这时分两 ...
- Ajax 与 Struts 1
Xml配置 <action path="/product/product/validateCurrencyDecimalSupport" type="com.neu ...