聚合查询和原生数据库操作及SQL注入问题

聚合查询和原生数据库操作

聚合查询

聚合查询是指对一个数据表中的一个字段的数据进行部分或全部进行统计查询,查bookstore book数据表中的全部书的平均价格,查询所有书的总个数等.都要使用聚合查询

聚合查询分为
整表聚合
分组聚合

整表聚合

不带分组的聚合查询是指导将全部数据进行集中统计查询

聚合函数[需要导入]:
导入方法: from djangodbmodels import *

​ 聚合函数: Sum,Avg,Count, Max, Min

语法: MyModel.objects.aggregate(结果变量名=聚合函数(‘列’))

返回结果: 结果变量名和值组成的字典

格式为:{“结果变量名”:值}

分组聚合

分组聚合是指通过计算查询结果中每一个对象所关联的对象集合从而得出总计值(也可以是平均值或总和),即为查询集的每一项生成聚合。
语法:
QuerySet.annotate(结果变量名=聚合函数(‘列’)
返回值
QuerySet

步骤1.通过先用查询结果MyModel.objects.values 查找查询要分组聚合的列

MyModel.obiects.values('列1','列2')

步骤2.通过返回结果的 QuerySet.annotate 方法分组聚合得到分组结果

QuerySet.annotate(名=聚合函数('列'))
原生数据库操作

Django也可以支持 直接用 sal语句的方式通信数据库

查询: 使用MyModel.objects.raw()进行 数据库查询操作查询

语法: MyModel.objects.raw(sgl语句,拼接参数)

返回值: RawQuerySet 集合对象【只支持基础操作,比如循环】

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

SQL注入问题

使用原生语句时小心 SOL注入
定义: 用户通过数据上传,将恶意的sql语句提交给服务器,从而达到攻击效果
案例1:用户在搜索好友的表单框里 输入1 or 1=1

s1 = Book.objects.raw('select * from bookstore_book where id=%s'%('1 or 1=1'))

攻击结果:可查询出所有用户数据

sql注入防范

错误-> s1 = Bookobiects.raw('select * from bookstore bookwhere id=%s%(1 or 1=1))

# 拼接参数
正确-> s2 = Bookobjects.raw('select * from bookstore bookwhere id=%s,['1 or 1=1'])

cursor

完全跨过模型类操作数据库- 查询/更新/删除
1导入cursor所在的包

from django.db import connection

2.用创建cursor类的构造函数创建cursor对象,再使用cursor对象为保证在出现异常时能释放cursor资源通常使用with语句进行创建操作

from django.db import connection
with connection.cursor() as cur:
	cur.execute('执行SQL语句','拼接参数')

你可能感兴趣的:(Django,django,数据库)