文档章节

sqlalchemy和flask-sqlalchemy查询结果转json

s
 stys35
发布于 02/23 23:27
字数 1079
阅读 12
收藏 0

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对象之一,当查询某个表全部字段时,如

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 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 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 in results]

    #这里r为一个字典,对象传递直接改变字典属性

    for 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 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 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

 

本文转载自:https://segmentfault.com/q/1010000000391642

共有 人打赏支持
s
粉丝 3
博文 50
码字总数 8243
作品 0
九龙
私信 提问
[flask-SQLAlchemy]关于flask-SQLAlchemy的初级使用教程

鉴于网上关于flask-SQLAlchemy的实例使用教程参差不齐,于此写下工作学习过程中的使用过程,以便分享交流。 对于python关于flask有一定了解的高端玩家来说,请转至flask官方开发文档。 一.安...

yzy121403725
2018/05/24
0
0
Flask中可以利用Flask-SQLAlchemy

官方文档:http://flask-sqlalchemy.pocoo.org/2.3/ 1.安装(进入虚拟环境)--利用镜像安装PyMySQL #python36 -m pip install PyMySQL -i http://pypi.mirrors.ustc.edu.cn/simple --trusted-......

编译中ing
2018/10/04
0
0
使用Flask-SQLALchemy操作MySQL数据库

1、简介 Flask-SQLAlchemy 是一个 Flask 扩展,简化了在 Flask程序中使用SQLAlchemy 的操作。SQLAlchemy 是一个很强大的关系型数据库框架,支持多种数据库后台。 SQLAlchemy 提供了高层 ORM,...

844365389
2018/06/27
0
0
Flask使用Flask-SQLAlchemy操作MySQL数据库

前言: Flask-SQLAlchemy是一个Flask扩展,简化了在Flask程序中使用SQLAlchemy的操作。SQLAlchemy是一个很强大的关系型数据库框架,支持多种数据库后台。SQLAlchemy提供了高层ORM,也提供了使...

小喜-3
2017/12/12
0
0
转-SQLAlchemy and You

written on Tuesday, July 19, 2011 from:http://lucumr.pocoo.org/2011/7/19/sqlachemy-and-you/ Without doubt are most new Python web programmers these days chosing the Django frame......

玉龙
2011/07/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

聊聊flink的KvStateRegistryGateway

序 本文主要研究一下flink的KvStateRegistryGateway KvStateRegistryGateway flink-1.7.2/flink-runtime/src/main/java/org/apache/flink/runtime/jobmaster/KvStateRegistryGateway.java pu......

go4it
25分钟前
4
0
Java springboot B2B2C o2o多用户商城 springcloud架构 (十四)在springboot中用redis实现消息队列

准备阶段 安装redis,可参考我的另一篇文章。 java 1.8 maven 3.0 idea 环境依赖 创建一个新的springboot工程,在其pom文件,加入spring-boot-starter-data-redis依赖: <dependency> ...

itcloud
32分钟前
1
0
云计算的2018年都有什么变化?

2018 年,区块链(Blockchain)在技术圈的风头一时无两,连此前大红大紫的人工智能(AI)都稍逊风骚,云计算圈则奋十年之余烈,完善产品,深耕行业,让越来越多的行业客户接受和实施云计算。回顾...

linuxCool
32分钟前
4
0
[activiti6]调用WebService几个坑

[activiti6]几个报错解决 运行test webservice org.activiti.engine.ActivitiException: no default process engine availableat org.activiti.engine.impl.test.PluggableActivitiTestCas......

Danni3
37分钟前
1
0
一张图看懂SQL的各种Join用法

下图展示了 LEFT JOIN、RIGHT JOIN、INNER JOIN、OUTER JOIN 相关的 7 种用法。 具体分解如下: 1、INNER JOIN(内连接)   SELECT FROM Table_A AINNER JOIN Table_B BON A.Key = B.Key 2、L......

dragon_tech
今天
17
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部