聚合查询和原生数据库操作及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语句','拼接参数')
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值