聚合查询指的是对一个数据表中的一个字段的数据进行部分或者全部进行统计查询,例如查某个表中的平均价格、查询总价格。
反正尽量用ORM吧,这只是一种暂缓之计!
聚合查询可以分为
不带分组的聚合查询是指将全部的数据进行集中统计查询。
from django.db.models import *
MyModels.objects.aggregate(结果变量名=聚合函数('列'))
# 以下是Django Shell的执行结果
>>> Asset.objects.aggregate(数据库ID行数=Count('id'))
{'数据库ID行数': 4}
返回的结果是以字典的方式组成的{结果变量名:值}
分组聚合是指通过计算查询结果中每一个对象所关联的对象集合,从而得出总计值,即为查询集的每一项生成聚合。
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列
QuerySet.annotate
方法分组聚合得到分组结果QuerySet.annotate(结果变量名=聚合函数('列'))
print(select.annotate(myCount=Count('id')))
分组聚合的返回值为QuerySet
django也可以支持直接使用SQL语句进行查询数据库
MyModels.objects.raw()
进行数据库查询操作
MyModels.objects.raw(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>
原理
[拼接参数]
那么默认的SQL语句就是 where id =1 or 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
完全跨过模型类操作数据库-查询/更新/删除
cursor
包from django.db import connection
cursor
类的构造函数创建cursor
对象,为了能够保证在出现异常的时候能够释放cursor
资源,所以通常用with
语句进行操作.from django.db import connection
with connection.cursor() as cur:
cur.execute('SQL','拼接参数')