在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ù)量,肯定沒問題,基本不用考慮性能。
