Django-18 聚合查询和原生数据库操作
2021-07-16 本文已影响0人
JuliusL
聚合查询(为统计而生)
聚合查询是指对一个数据表中的一个字段的数据进行部分或全部进行统计查询,查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
完全跨过模型类操作数据库-查询/更新/删除
- 导包 from django.db import connection
- 用创建cursor类的构造函数创建cursor对象,再使用cursor对象,为保证在出现异常时能释放cursor资源,通常使用with语句进行创建操作。
from django.db import connection
with connection.cursor() as cur:
cur.excute('执行SQL语句','拼接参数')