python中 将sqlalchemy中查询结果转换为字典的两种方法(目的是转换成json字符串)
开始,第一个方法之前,我们要来认识一下 dict() 这个函数, 它的传入参数可以是一个对象,但前提是这个对象的内部有 keys()方法返回转成字典所包含的键的列表并且,该对象的内部实现了 __item__()方法如下图:是没有实现这两个方法的类,代码报错:当我们在类的上面实现keys()和 __getItem__()方法时,就可以了有了以上的认识,我的想法是,在...
开始,第一个方法之前,我们要来认识一下 dict() 这个函数, 它的传入参数可以是一个对象,
但前提是这个对象的内部有 keys()方法返回转成字典所包含的键的列表
并且,该对象的内部实现了 __item__()方法
如下图:是没有实现这两个方法的类,代码报错:
当我们在类的上面实现keys()和 __getItem__()方法时,就可以了
有了以上的认识,我的想法是,在sqlalchemy 的db.models的类的定义中加上这两个方法,实现orm模型对象转换为数组
当我们视图函数中使用query.all()等查询出结果以后是 一个 list的列表,然后对列表中的每一个元素(其是就是一个orm模型),使用dict(orm模型),就可以了
以上就是第一种方法,不方便的地方在于,取出数据后,还要再遍历一次,加上dict()函数
感叹一下,还是php中的数组强大,json_encode(array), 就解决了,这点python真赶不上php
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
现在再来说一下,第二种方法
直接上代码吧,代码中的注释应该可以看懂
def query2dict(model_list):
if isinstance(model_list,list): #如果传入的参数是一个list类型的,说明是使用的all()的方式查询的
if isinstance(model_list[0],db.Model): # 这种方式是获得的整个对象 相当于 select * from table
lst = []
for model in model_list:
dic = {}
for col in model.__table__.columns:
dic[col.name] = getattr(model,col.name)
lst.append(dic)
return lst
else: #这种方式获得了数据库中的个别字段 相当于select id,name from table
lst = []
for result in model_list: #当以这种方式返回的时候,result中会有一个keys()的属性
lst.append([dict(zip(result.keys, r)) for r in result])
return lst
else: #不是list,说明是用的get() 或者 first()查询的,得到的结果是一个对象
if isinstance(model_list,db.Model): # 这种方式是获得的整个对象 相当于 select * from table limit=1
dic = {}
for col in model_list.__table__.columns:
dic[col.name] = getattr(model_list,col.name)
return dic
else: #这种方式获得了数据库中的个别字段 相当于select id,name from table limit = 1
return dict(zip(model_list.keys(),model_list))
更多推荐
所有评论(0)