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...