前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Django的聚合查询与原生操作

Django的聚合查询与原生操作

作者头像
Yuou
发布2022-09-26 15:32:30
6610
发布2022-09-26 15:32:30
举报
文章被收录于专栏:乱七八糟技术日常

聚合查询

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

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

聚合查询可以分为

  • 整表聚合
  • 分组聚合

整表聚合

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

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

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

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

分组聚合

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

  1. 通过先用查询结果Mymodels.objects.values查找要分组聚合的列
代码语言:javascript
复制
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方法分组聚合得到分组结果
代码语言:javascript
复制
QuerySet.annotate(结果变量名=聚合函数('列'))
print(select.annotate(myCount=Count('id')))

分组聚合的返回值为QuerySet

原生数据库操作

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

  • 查询:使用MyModels.objects.raw()进行数据库查询操作
  • 语法:MyModels.objects.raw(SQL语句,拼接参数)
  • 返回值:返回RawQuerySet集合,只支持基础操作
  • 防止SQL注入

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

代码语言:javascript
复制
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的值

代码语言:javascript
复制
 select * from monitor_asset where 'id=1 or 1=1'
 相当于第一个int值得话就是 id=1 而不是 id=1 or 1=1

完全的原生操作

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

  1. 导入cursor
代码语言:javascript
复制
from django.db import connection
  1. 用创建的cursor类的构造函数创建cursor对象,为了能够保证在出现异常的时候能够释放cursor资源,所以通常用with语句进行操作.
代码语言:javascript
复制
from django.db import connection
with connection.cursor() as cur:
    cur.execute('SQL','拼接参数')
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 聚合查询
    • 整表聚合
      • 分组聚合
      • 原生数据库操作
      • 完全的原生操作
      相关产品与服务
      数据库
      云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档