聚合查询
指对一个数据表里的所有元素进行部分(整表聚合)或者全部(分组聚合)统计查询
eg:统计平均值、最大、最小值等
整表查询:
1、导入
from django.db.models import *
2、聚合函数
Sum
Avg
Count
Max
Min
3、使用
Mymodel.objects.aggregate(结果变量名=聚合函数('列名'))
4、返回值
结果变量名和值组成的字典
mysql中的语句:
统计所有个数,
select count(*) as 结果变量名 from 表名
最终输出了一个表。斜体样式
分组聚合:
1、使用
QuerySet.annotatre(结果变量名=聚合函数(‘列名’))
2、返回值
返回一个QuerySet对象。
在使用时,要先使用mymodels.objects.values()查询要分组聚合的列。
返回的QuerySet可以继续进行过滤或者聚合操作。
原生数据库操作
一、
Django也支持直接使用数据库原生的语句操作,返回RawQuerySet对象,无法继续使用筛选等操作,只可进行循环等基础操作,且与数据库耦合,不建议使用。
语法:
data=mymodels.objects.raw('SQL语句')
注意!!!
使用SQL语句时严防sql注入,一般根据用户传递的信息拼接SQL语句,若用户输入了SQL语句,与你的原生语句拼接成了新的SQL语句,可能会导致数据库信息泄露,遭到攻击。
eg:
data=mymodels.objects.raw('select * from tables1 where id=%s'%userdata)
原本想根据id查询table1里的信息,若用户输入‘1 or 1=1’,则用户可获得该表单所有数据
eg:若在登录时使用
user=mymodels.objects.raw(f'select * from tables1 where name={name} and password={password}')
若用户在name输入lenglu#,则会将密码匹配注释掉,直接登录lenglu的账号。
故更加推荐django内置的ORM。
也可将需要拼接的参数放在row函数的第二个参数里,安全传入。
data=mymodels.objects.raw('select * from tables1 where id=%s',userdata)
二、
row方法虽然也可以使用sql语句,但仍然要经过模型类。
cursor使用完全独立的操作,完全跨过模型类。
1、导入
from django.db import connection
2、使用
用创建cursor类的构造函数创建cursor对象,再使用cursor对象,为保证出现异常时释放cursor资源,通常使用with语句进行创建。
with connection.cursor() as cur:
cur.excute('SQL语句','拼接参数')
cur.excute('SQL语句','拼接参数')可以返回成功执行语句的数据条数。