日韩精品欧美激情国产一区_中文无码精品一区二区三区在线_岛国毛片AV在线无码不卡_亞洲歐美日韓精品在線_使劲操好爽好粗视频在线播放_日韩一区欧美二区_八戒八戒网影院在线观看神马_亚洲怡红院在线色网_av无码不卡亚洲电影_国产麻豆媒体MDX

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

時間:2022-01-30 23:52:56 類型:python
字號:    

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


<