在django中執(zhí)行自定義語句的時候,返回的結(jié)果是一個tuple ,并非我們期望的dict.
如果想將查詢結(jié)果返回字典的形式,我們必須自己動手,豐衣足食
1.根據(jù)cursor中的 description 得到各查詢的字段名
2.根據(jù)得到的結(jié)果,把這兩個拼湊起來得到結(jié)果
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
現(xiàn)在返回的結(jié)果就是 字典類型的了。
總結(jié)成一個方法:
def dict_fetch_all(cursor): "將游標(biāo)返回的 多條 結(jié)果保存到一個字典對象中" 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): "將游標(biāo)返回的 單條 結(jié)果保存到一個字典對象中" desc = cursor.description result = cursor.fetchone() keys = [col[0] for col in desc] return {keys[index] : result[index] for index in range(len(keys))} #調(diào)用方法如下: #"多條查詢" 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"))
直接傳入結(jié)果的cursor ,就可以得到結(jié)果集為dict 的類型。
總結(jié):如果用 django 不是復(fù)雜的SQL 查詢,盡量用 orm 去完成。如果是比較復(fù)雜的SQL語句,涉及到很多表,而且并不完全滿足django 的foregion key ,甚至是多個 primary key 對應(yīng)的話,就自己用 原生的SQL 去完成??赡軙茫谏勺值涞臅r候,數(shù)據(jù)量不要太大,沒測試過太大會有什么性能問題。但對于小數(shù)據(jù)量,肯定沒問題,基本不用考慮性能。