手把手教你用Django執行原生SQL

2021-10-18 23:17:20 字數 4015 閱讀 8722

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,還是比較有用的,

語法如下

models.表名.objecs.raw(sql)models.表名.objecs.raw(sql,[引數1,引數2])
注:如果沒有引數,就只寫sql語句,如果由引數,後面需要用列表,如圖所示舉例

返回的仍然乙個個的book物件

上述的,其實還是和django的model有些繫結。但是我就是說,我就是想要原生sql,不要跟任何繫結。

這裡說一下,千萬不要在django使用pymysql執行原生sql,會發生一些奇怪的問題。一定要匯入from django.db import connection執行sql。**如下:

from django.db import connectiondef 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 第四章 迴圈神經網路 ...