聚合查询

​ 聚合查询指的是对一个数据表中的一个字段的数据进行部分或者全部进行统计查询,例如查某个表中的平均价格、查询总价格。

反正尽量用ORM吧,这只是一种暂缓之计!

聚合查询可以分为

  • 整表聚合
  • 分组聚合

整表聚合

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

  • Sum、Avg、Count、Max、Min等
from django.db.models import *
MyModels.objects.aggregate(结果变量名=聚合函数('列'))

# 以下是Django Shell的执行结果
>>> Asset.objects.aggregate(数据库ID行数=Count('id'))
{'数据库ID行数': 4}

返回的结果是以字典的方式组成的{结果变量名:值}

分组聚合

​ 分组聚合是指通过计算查询结果中每一个对象所关联的对象集合,从而得出总计值,即为查询集的每一项生成聚合。

  1. 通过先用查询结果Mymodels.objects.values查找要分组聚合的列
from django.db.models import *
from apps.monitor.models import Asset
Mymodels.objects.values('列1','列2')
select = Asset.objects.values('id','create_user') # id列和create_user列
  1. 通过返回结果的QuerySet.annotate方法分组聚合得到分组结果
QuerySet.annotate(结果变量名=聚合函数('列'))
print(select.annotate(myCount=Count('id')))

分组聚合的返回值为QuerySet

原生数据库操作

django也可以支持直接使用SQL语句进行查询数据库

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

  • 语法:MyModels.objects.raw(SQL语句,拼接参数)

  • 返回值:返回RawQuerySet集合,只支持基础操作

  • 防止SQL注入

因为SQL注入可以查出你所有用户的数据

select = Asset.objects.raw('select * from monitor_asset where id =%s',[1 od 1=1])
<RawQuerySet: select * from monitor_asset where id=1 or 1=1> 

原理

  1. 如果你不加[拼接参数]

那么默认的SQL语句就是 where id =1 or 1=1

  1. 如果加上[拼接参数]

那么这个时候你的SQL语句就是 ‘where id=1 or 1=1’

因为int型的话变为字符串的首先会先找第一个int的值

select * from monitor_asset where 'id=1 or 1=1'
相当于第一个int值得话就是 id=1 而不是 id=1 or 1=1

完全的原生操作

完全跨过模型类操作数据库-查询/更新/删除

  1. 导入cursor
from django.db import connection
  1. 用创建的cursor类的构造函数创建cursor对象,为了能够保证在出现异常的时候能够释放cursor资源,所以通常用with语句进行操作.
from django.db import connection
with connection.cursor() as cur:
    cur.execute('SQL','拼接参数')