Django-18 聚合查詢和原生數據庫操作 聚合查詢(爲統計而生) 原生數據庫操作

聚合查詢(爲統計而生)

聚合查詢是指對一個數據表中的一個字段的數據進行部分或全部進行統計查詢,查bookstore_book數據表中的全部書的平均價格,查詢所有書的總個數等,都要使用聚合查詢,聚合查詢分爲

  • 整表查詢
  • 分組查詢

整表聚合

不帶分組的聚合查詢是指導將全部數據進行集中統計查詢
聚合函數[需要導入]

  • 導入方法:from django.db.models import *
  • 聚合函數:Sum,Avg,Count,Max,Min
    語法:MyModel.objects.aggregate(結果變量名=聚合函數('列'))
  • 返回結果:結果變量名和值組成的字典
  • 格式爲:{"結果變量名":值}

分組聚合

分組聚合是指通過計算查詢結果中每一個對象所關聯的對象集合,從而得出宗繼志(也可以是平均值或總和),即爲查詢集的每一項生成聚合。
語法:

  • QuerySet.annotate(結果變量名=聚合函數('列'))
  • 返回值: QuerySet
    1,通過先用查詢結果MyModel.objects.values查找查詢要分組聚合的列
    MyModel.objects.values('列1','列2')
    2,通過返回結果的QuerySet.annotate方法分組聚合得到分組結果
pub_set = Book.objects.values('pub')
pub_count_set = pub_set.annotate(myCount=Count('pub'))

原生數據庫操作

查詢

Django也可以支持直接用sql語句的方式通信數據庫
查詢:使用MyModel.objects.raw()進行數據庫查詢操作
語法:MyModel.objects.raw(sql語句,拼接參數)
返回值:RawQuerySet集合對象【只支持基礎操作,比如循環】

books = models.Book.objects.raw('select * from bookstore_book')
for book in books:
  print(book)

SQL注入

防SQL注入的正確寫法

s2 = Book.objects.raw('select * from book where id=%s',['1 or 1=1'])

cursor

完全跨過模型類操作數據庫-查詢/更新/刪除

  1. 導包 from django.db import connection
  2. 用創建cursor類的構造函數創建cursor對象,再使用cursor對象,爲保證在出現異常時能釋放cursor資源,通常使用with語句進行創建操作。
from django.db import connection
with connection.cursor() as cur:
  cur.excute('執行SQL語句','拼接參數')
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章