在django中執行自定義語句的時候,返回的結果是一個tuple ,並我不是我所期望的dict.
當結果是tuple 時,如果要取得數據,必須知道對應數據在結果集中的序號,用序號的方式去得到值。
如果是python與mysql 方式,這種方式可以得到dict結果
conn = getConnection(dbparams)
cursor=conn.cursor(cursorclass = MySQLdb.cursors.DictCursor);
vreturn=cursor.execute(sql)
cursor=conn.cursor(cursorclass = MySQLdb.cursors.DictCursor);
vreturn=cursor.execute(sql)
但django中,沒有cursorclass 這個參數。只能自己去實現
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 dictfetchall(cursor):
"將游標返回的結果保存到一個字典對象中"
desc = cursor.description
return [
dict(zip([col[0] for col in desc], row))
for row in cursor.fetchall()
]
直接傳入結果的cursor ,就可以得到結果集為dict 的類型。
總結:如果用 django 不是復雜的SQL 查詢,盡量用 orm 去完成。如果是比較復雜的SQL語句,涉及到很多表,而且並不完全滿足django 的foregion key ,甚至是多個 primary key 對應的話,就自己用 原生的SQL 去完成。可能會更好,但在生成字典的時候,數據量不要太大,沒測試過太大會有什么性能問題。但對於小數據量,肯定沒問題,基本不用考慮性能。