hey,各位小夥伴,這次怎麼來玩一下,如何使用django執行原生sql。
我們都知道,python在web界的扛把子——django,可謂是集大成為統一,各種各樣的外掛程式、forms元件、model模型、admin後台等等,後面我會專門出文章娓娓道來,反正就是乙個字,nb。
本次就來學一下,如何在django執行原生語句。
在使用django時,一般情況下,我們使用django自帶的model查詢是沒有問題的,基本能滿足80%的問題
但是,但是,那20%就不要了嗎???肯定不行哎,小孩才做選擇
在django執行原生sql有以下三種方式
一般情況下,就以上三種方式
就是乙個很簡單的圖書表class book(models.model):
title = models.charfield(verbose_name="書名", max_length=32)
describe = models.textfield(verbose_name="描述")
author = models.charfield(verbose_name="作者", max_length=32)
publisher = models.charfield(verbose_name="出版社", max_length=32)
publisher_date = models.datefield(verbose_name="publisher")
通過admin錄入一些資料測試使用
強烈建議,不用學,沒毛用
這個相比較extra,還是比較有用的,
語法如下
注:如果沒有引數,就只寫sql語句,如果由引數,後面需要用列表,如圖所示舉例models.表名.objecs.raw(sql)
models.表名.objecs.raw(sql,[引數1,引數2])
返回的仍然乙個個的book物件
上述的,其實還是和django的model有些繫結。但是我就是說,我就是想要原生sql,不要跟任何繫結。
這裡說一下,千萬不要在django使用pymysql執行原生sql,會發生一些奇怪的問題。一定要匯入from django.db import connection
執行sql。**如下:
返回內容如下圖所示:from django.db import connection
def book_list(request):
# 真正的原生sql,
cursor = connection.cursor()
print(type(cursor))
raw = cursor.fetchall()
print(raw)
可以看到,返回的是列表裡面套乙個個的陣列。我就在想,有沒有什麼辦法能將查詢出來的sql,直接返回成字典呢?答案是當然可以!
我將執行原生sql並且直接返回成字典的方式封裝成了兩個函式
乙個是查詢多個,**如下所示:
乙個是查詢乙個,**如下所示:def query_all_dict(sql, params=none):
'''
查詢所有結果返回字典型別資料
:param sql:
:param params:
:return:
'''
with connection.cursor() as cursor:
if params:
cursor.execute(sql, params=params)
else:
cursor.execute(sql)
col_names = [desc[0] for desc in cursor.description]
row = cursor.fetchall()
rowlist =
for list in row:
tmap = dict(zip(col_names, list))
return rowlist
用法如下,直接在檢視中呼叫函式def query_one_dict(sql, params=none):
"""
查詢乙個結果返回字典型別資料
:param sql:
:param params:
:return:
"""
with connection.cursor() as cursor:
if params:
cursor.execute(sql, params=params)
else:
cursor.execute(sql)
col_names = [desc[0] for desc in cursor.description]
row = cursor.fetchone()
tmap = dict(zip(col_names, row))
return tmap
返回結果如下,直接是列表套字典格式
那查詢帶條件的怎麼辦哪,其實和pymysql乙個樣
返回結果
但是有個問題,上面的查詢,我們明明知道,讓只會返回乙個值,但是還是返回的是列表套字典格式,似乎不太對吶?
其實上述我寫的是兩個辦法,如果確定就查詢乙個值,使用query_one_dict
方法。
django中執行原生sql有3種方式,extra
,raw
,from django.db import connection
其中extra
基本沒用,raw
湊合,但是和models
有繫結,connection
最靈活,但是預設返回的是[tuple,tuple,tuple,]格式
經過改良,封裝出兩個方法,query_all_dict
,query_one_dict
,乙個是查詢多個,乙個是查詢單個,並且返回成[dict,dict,dict,]
建議
只使用query_all_dict
,query_one_dict
django_exec_sql.zip
上述以入門的方式解決了安排了以下如何通過django執行原生sql。
用微笑告訴別人,今天的我比昨天強,今後也一樣。
手把手教你用Ucos
ucos作業系統的學習 實時作業系統 任務切換,排程 分式作業系統 不可剝奪型核心 ucosii嵌入式實時作業系統的源 分為三部分 與硬體無關的核心 與處理器有關的移植 和使用者配置檔案。ucos最多支援64個任務,優先順序分別對應0 63,其中0為最高優先順序,系統保留4個最高優先順序的任務,和4...
手把手教你用Charles抓包
日常開發過程中難免要進行抓包,檢視服務端返回的資料是否正常,而charles可謂是抓包利器了。配置好以後,charles實際上讓電腦成了乙個中間 伺服器,我們手機上的所有請求都會經過電腦,被charles攔截,然後charles把自己偽裝成手機向我們的遠端伺服器位址傳送請求,所以charles能記錄...
手把手教你用Python實踐深度學習
課程共七章,採用最新版本進行教學,2018必學技術 第一章 從人工智慧到深度學習 第二章 使用tensorflow keras 建構人工神經網路 artificial neural network 第三章 卷積神經網路 convolutional neural network 第四章 迴圈神經網路 ...