orm分组,聚合查询,执行原生sql语句

时间:2023-02-13 06:38:26
from   django.db.models  import Avg

from   app01 import models

annotate:(聚合查询)

ret=models.Article.objects.values('up_count').annotate(a=Avg('comment_count')).values('up_count','a')

#原理讲解:之前这个是按照这个up_count来分组的,后面这个是求这个平均的值,后面是打印出什么值出来,
a=Avg('comment_count')这个相当于sql语句的select  Avg(comment_count) as  a
'''
注明一下,当这个annotate前面是什么,那么这个后面就按照什么来分组,比如这个前面这个分组的字段有很多值的话,那么后面就是求它的平均值,如果是all的话,就是那这个全部的数据进行分组(失去了意义)
''' print(ret) 结果:

<QuerySet [{'up_count': 0, 'a': 0.0}, {'up_count': 1, 'a': 55.0}, {'up_count': 100, 'a': 10.0}]>

extra:(可以在orm数据操作时候额外在extra里面加上sql语句)

 '''
讲解:
这个下面的步骤就是相当于后面的up_count>10,是一个筛选的条件,也就是up_count as choice,extra里面
完整的sql语句是:
select up_count>10 as choice ,article.title,article.up_count FROM Article
'''
ret=models.Article.objects.values('title','up_count').extra(
select={'choice':'up_count>11'}
) print(ret)
for i in ret:
print(i) 结果:

<QuerySet [{'title': 'python基础', 'up_count': 1}, {'title': 'go的操作', 'up_count': 100}, {'title': 'go的天然并发', 'up_count': 0}, {'title': 'linux高级指令', 'up_count': 1}]>
{'title': 'python基础', 'up_count': 1}
{'title': 'go的操作', 'up_count': 100}
{'title': 'go的天然并发', 'up_count': 0}
{'title': 'linux高级指令', 'up_count': 1}

例子:

    ret=models.Article.objects.all().extra(
select={'choice':'up_count>11'}
)
##这个choice当成一个筛选的条件,当条件为真的时候,就是1,为假就是0 print(ret)
for i in ret:
print(i.up_count,i.title,i.choice) 结果:

<QuerySet [<Article: python基础>, <Article: go的操作>, <Article: go的天然并发>, <Article: linux高级指令>]>
1 python基础 0
100 go的操作 1
0 go的天然并发 0
1 linux高级指令 0

执行原生sql语句:

连接这个sql,执行这个sql的语句:
from django.db import connection
cursor=connection.curson()获取这个光标,等待执行这个sql的语句
curson.execute("这个里面是sql的语句")
row=cursor.fetchone()
这个row就是最终的执行的结果