Django原生SQL语句查询返回字典

时间:2022-01-30 23:52:56 类型:python
字号:    

  在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 去完成。可能会更好,但在生成字典的时候,数据量不要太大,没测试过太大会有什么性能问题。但对于小数据量,肯定没问题,基本不用考虑性能。


<