在django中执行自定义语句的时候,返回的结果是一个tuple ,并非我们期望的dict.
如果想将查询结果返回字典的形式,我们必须自己动手,丰衣足食
1.根据cursor中的 description 得到各查询的字段名
2.根据得到的结果,把这两个拼凑起来得到结果
1 2 3 4 5 6 7 8 9 | 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 |
现在返回的结果就是 字典类型的了。
总结成一个方法:
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 | 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 去完成。可能会更好,但在生成字典的时候,数据量不要太大,没测试过太大会有什么性能问题。但对于小数据量,肯定没问题,基本不用考虑性能。