在django中执行自定义语句的时候,返回的结果是一个tuple ,并非我们期望的dict.
如果想将查询结果返回字典的形式,我们必须自己动手,丰衣足食
1.根据cursor中的 description 得到各查询的字段名
2.根据得到的结果,把这两个拼凑起来得到结果
from django.db import connection def runquery(sql): cursor = connection.cursor() cursor.execute(sql,None) col_names = [desc[0] for desc in cursor.description] print col_names row=cursor.fetchone() row = dict(zip(col_names, row)) print row
现在返回的结果就是 字典类型的了。
总结成一个方法:
def dict_fetch_all(cursor): "将游标返回的 多条 结果保存到一个字典对象中" desc = cursor.description result = cursor.fetchall() return [dict(zip([col[0] for col in desc], row))for row in result] def dict_fetch_one(cursor): "将游标返回的 单条 结果保存到一个字典对象中" desc = cursor.description result = cursor.fetchone() keys = [col[0] for col in desc] return {keys[index] : result[index] for index in range(len(keys))} #调用方法如下: #"多条查询" sql = "select title,keyword from zz_news" cursor.execute(sql) result = dict_fetch_all(cursor) for row in result: print(row.get("title")) #单条查询 sql = "select * from zz_news where id = 5" cursor.execute(sql) result = dict_fetch_one(cursor) print(result.get("title"),result.get("createtime"))
直接传入结果的cursor ,就可以得到结果集为dict 的类型。
总结:如果用 django 不是复杂的SQL 查询,尽量用 orm 去完成。如果是比较复杂的SQL语句,涉及到很多表,而且并不完全满足django 的foregion key ,甚至是多个 primary key 对应的话,就自己用 原生的SQL 去完成。可能会更好,但在生成字典的时候,数据量不要太大,没测试过太大会有什么性能问题。但对于小数据量,肯定没问题,基本不用考虑性能。