Django執行原生SQL

2021-10-16 18:13:17 字數 4065 閱讀 7410

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 connection

defbook_list

(request)

:# 真正的原生sql,

cursor = connection.cursor(

)print

(type

(cursor)

) cursor.execute(,[

1,])

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 =

forlist

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

我是碼農星期八,如果覺得還不錯,記得動手點讚以下哈,

感謝你的**

django執行原生sql

一 orm row 方法 只能實現查詢 d list models.article.objects.raw select nid,count nid as num,strftime y m create time as ctime from blog article where user id st...

Django執行原生SQL語句

msg show successfully error tag 0 用connection庫 和原生的sql語句讀資料庫,如下 from django.db import connection 匯入connection sql str select from book str型別的原生sql語句 c...

Django之ORM執行原生sql語句

django 中的orm 提供的操作功能有限,在模型提供的查詢 api不能滿足實際工作需要時,可以在 orm中直接執行原生sql語句。django 提供兩種方法使用原生sql進行查詢 一種是使用raw 方法,進行原生sql查詢並返回模型例項 另一種是完全避開模型層,直接執行自定義的sql語句。raw...