久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

Django中怎么執(zhí)行原生SQL

173次閱讀
沒有評論

共計 2328 個字符,預(yù)計需要花費 6 分鐘才能閱讀完成。

這期內(nèi)容當中丸趣 TV 小編將會給大家?guī)碛嘘P(guān) Django 中怎么執(zhí)行原生 SQL,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

表結(jié)構(gòu)

文件:django_project/app01/models

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 錄入一些數(shù)據(jù)測試使用

extra 方式

強烈建議, 不用學(xué), 沒毛用

raw 方式

這個相比較 extra, 還是比較有用的,

語法如下

models. 表名.objecs.raw(sql) models. 表名.objecs.raw(sql,[參數(shù) 1, 參數(shù) 2])

注: 如果沒有參數(shù), 就只寫 sql 語句, 如果由參數(shù), 后面需要用列表, 如圖所示

舉例

返回的仍然一個個的 Book 對象

真正的原生 sql 方式

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

這里說一下,千萬不要在 django 使用 pymysql 執(zhí)行原生 sql,會發(fā)生一些奇怪的問題。一定要導(dǎo)入 from django.db import  connection 執(zhí)行 sql。代碼如下:

from django.db import connection def book_list(request): #  真正的原生 sql, cursor = connection.cursor() print(type(cursor)) cursor.execute(select * from app01_book where id=%s , [1, ]) raw = cursor.fetchall() print(raw)

返回內(nèi)容如下圖所示:

可以看到,返回的是列表里面套一個個的數(shù)組。我就在想,有沒有什么辦法能將查詢出來的 sql,直接返回成字典呢? 答案是當然可以!

執(zhí)行原生 sql 并且返回成 dict

我將執(zhí)行原生 sql 并且直接返回成字典的方式封裝成了兩個函數(shù)

一個是查詢多個,代碼如下所示:

def query_all_dict(sql, params=None):    查詢所有結(jié)果返回字典類型數(shù)據(jù)  :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)) rowList.append(tMap) return rowList

一個是查詢一個,代碼如下所示:

def query_one_dict(sql, params=None):    查詢一個結(jié)果返回字典類型數(shù)據(jù)  :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

用法如下, 直接在視圖中調(diào)用函數(shù)

返回結(jié)果如下, 直接是列表套字典格式

那查詢帶條件的怎么辦哪, 其實和 pymysql 一個樣

返回結(jié)果

但是有個問題,上面的查詢, 我們明明知道,讓只會返回一個值,但是還是返回的是列表套字典格式,似乎不太對吶?

其實上述我寫的是兩個辦法,如果確定就查詢一個值,使用 query_one_dict 方法。

上述總結(jié)

django 中執(zhí)行原生 sql 有 3 種方式,extra,raw,from django.db import connection

其中 extra 基本沒用,raw 湊合, 但是和 models 有綁定,connection 最靈活, 但是默認返回的是 [tuple,tuple,tuple,] 格式

經(jīng)過改良, 封裝出兩個方法,query_all_dict,query_one_dict, 一個是查詢多個, 一個是查詢單個, 并且返回成[dict,dict,dict,]

建議

只使用 query_all_dict,query_one_dict

項目代碼

django_exec_sql.zip

上述就是丸趣 TV 小編為大家分享的 Django 中怎么執(zhí)行原生 SQL 了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關(guān)知識,歡迎關(guān)注丸趣 TV 行業(yè)資訊頻道。

正文完
 
丸趣
版權(quán)聲明:本站原創(chuàng)文章,由 丸趣 2023-08-03發(fā)表,共計2328字。
轉(zhuǎn)載說明:除特殊說明外本站除技術(shù)相關(guān)以外文章皆由網(wǎng)絡(luò)搜集發(fā)布,轉(zhuǎn)載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 百色市| 丰顺县| 饶阳县| 合山市| 济宁市| 什邡市| 常熟市| 东兰县| 龙陵县| 绥中县| 德江县| 米林县| 昌邑市| 梓潼县| 北流市| 尚义县| 延川县| 明光市| 会同县| 慈利县| 交城县| 稷山县| 麻城市| 古交市| 句容市| 镇江市| 海门市| 绿春县| 大兴区| 德令哈市| 明水县| 两当县| 吐鲁番市| 萨迦县| 马尔康县| 凌云县| 阳原县| 仪征市| 咸宁市| 武山县| 沙河市|