18.Django原生SQL語句查詢返回字典


在django中執行自定義語句的時候,返回的結果是一個tuple ,並我不是我所期望的dict.
當結果是tuple 時,如果要取得數據,必須知道對應數據在結果集中的序號,用序號的方式去得到值。

如果是python與mysql 方式,這種方式可以得到dict結果

  conn = getConnection(dbparams)
  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 去完成。可能會更好,但在生成字典的時候,數據量不要太大,沒測試過太大會有什么性能問題。但對於小數據量,肯定沒問題,基本不用考慮性能。 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM