Django的model查询操作 与 查询性能优化

1 如何 在做ORM查询时 查看SQl的执行情况

(1) 最底层的 django.db.connection

在 django shell 中使用  python manage.py shell>>> from django.db import connection
>>> Books.objects.all()
>>> connection.queries    ## 可以查看查询时间
[{'sql': 'SELECT "testsql_books"."id", "testsql_books"."name", "testsql_books"."author_id" FROM "testsql_books" LIMI
T 21', 'time': '0.002'}]

(2) django-extensions 插件

 。  pip install django-extensions。   INSTALLED_APPS = (...'django_extensions',...)。     在 django shell 中使用  python manage.py shell_plus  --print-sql (extensions 强化)这样每次查询都会 有sql 输出>>>  from testsql.models import Books>>>  Books.objects.all()SELECT "testsql_books"."id", "testsql_books"."name", "testsql_books"."author_id" FROM "testsql_books" LIMIT 21Execution time: 0.002000s [Database: default]<QuerySet [<Books: Books object>, <Books: Books object>, <Books: Books object>]>

2 ORM查询操作 以及优化

基本操作

  增models.Tb1.objects.create(c1='xx', c2='oo')  增加一条数据,可以接受字典类型数据 **kwargsobj = models.Tb1(c1='xx', c2='oo')
obj.save()查models.Tb1.objects.get(id=123)         # 获取单条数据,不存在则报错(不建议)
models.Tb1.objects.all()               # 获取全部
models.Tb1.objects.filter(name='seven') # 获取指定条件的数据
models.Tb1.objects.exclude(name='seven') # 获取指定条件的数据删models.Tb1.objects.filter(name='seven').delete() # 删除指定条件的数据改
models.Tb1.objects.filter(name='seven').update(gender='0')  # 将指定条件的数据更新,均支持 **kwargs
obj = models.Tb1.objects.get(id=1)
obj.c1 = '111'
obj.save()                                                 # 修改单条数据

查询简单操作

获取个数models.Tb1.objects.filter(name='seven').count()大于,小于models.Tb1.objects.filter(id__gt=1)              # 获取id大于1的值models.Tb1.objects.filter(id__gte=1)              # 获取id大于等于1的值models.Tb1.objects.filter(id__lt=10)             # 获取id小于10的值models.Tb1.objects.filter(id__lte=10)             # 获取id小于10的值models.Tb1.objects.filter(id__lt=10, id__gt=1)   # 获取id大于1 且 小于10的值inmodels.Tb1.objects.filter(id__in=[11, 22, 33])   # 获取id等于11、22、33的数据models.Tb1.objects.exclude(id__in=[11, 22, 33])  # not inisnullEntry.objects.filter(pub_date__isnull=True)containsmodels.Tb1.objects.filter(name__contains="ven")models.Tb1.objects.filter(name__icontains="ven") # icontains大小写不敏感models.Tb1.objects.exclude(name__icontains="ven")rangemodels.Tb1.objects.filter(id__range=[1, 2])   # 范围bettwen and其他类似startswith,istartswith, endswith, iendswith,order bymodels.Tb1.objects.filter(name='seven').order_by('id')    # ascmodels.Tb1.objects.filter(name='seven').order_by('-id')   # descgroup by--annotatefrom django.db.models import Count, Min, Max, Summodels.Tb1.objects.filter(c1=1).values('id').annotate(c=Count('num'))SELECT "app01_tb1"."id", COUNT("app01_tb1"."num") AS "c" FROM "app01_tb1" WHERE "app01_tb1"."c1" = 1 GROUP BY "app01_tb1"."id"limit 、offsetmodels.Tb1.objects.all()[10:20]regex正则匹配,iregex 不区分大小写Entry.objects.get(title__regex=r'^(An?|The) +')Entry.objects.get(title__iregex=r'^(an?|the) +')dateEntry.objects.filter(pub_date__date=datetime.date(2005, 1, 1))Entry.objects.filter(pub_date__date__gt=datetime.date(2005, 1, 1))yearEntry.objects.filter(pub_date__year=2005)Entry.objects.filter(pub_date__year__gte=2005)monthEntry.objects.filter(pub_date__month=12)Entry.objects.filter(pub_date__month__gte=6)dayEntry.objects.filter(pub_date__day=3)Entry.objects.filter(pub_date__day__gte=3)week_dayEntry.objects.filter(pub_date__week_day=2)Entry.objects.filter(pub_date__week_day__gte=2)hourEvent.objects.filter(timestamp__hour=23)Event.objects.filter(time__hour=5)Event.objects.filter(timestamp__hour__gte=12)minuteEvent.objects.filter(timestamp__minute=29)Event.objects.filter(time__minute=46)Event.objects.filter(timestamp__minute__gte=29)secondEvent.objects.filter(timestamp__second=31)Event.objects.filter(time__second=2)Event.objects.filter(timestamp__second__gte=31)

查询复杂操作

FK foreign key 使用的原因:

约束
节省硬盘但是多表查询会降低速度,大型程序反而不使用外键,而是用单表(约束的时候,通过代码判断)

extra

    extra(self, select=None, where=None, params=None, tables=None, order_by=None, select_params=None)Entry.objects.extra(select={'new_id': "select col from sometable where othercol > %s"}, select_params=(1,))Entry.objects.extra(where=['headline=%s'], params=['Lennon'])Entry.objects.extra(where=["foo='a' OR bar = 'a'", "baz = 'a'"])Entry.objects.extra(select={'new_id': "select id from tb where id > %s"}, select_params=(1,), order_by=['-nid'])

F

    from django.db.models import Fmodels.Tb1.objects.update(num=F('num')+1)

Q

    方式一:Q(nid__gt=10)Q(nid=8) | Q(nid__gt=10)Q(Q(nid=8) | Q(nid__gt=10)) & Q(caption='root')方式二:con = Q()q1 = Q()q1.connector = 'OR'q1.children.append(('id', 1))q1.children.append(('id', 10))q1.children.append(('id', 9))q2 = Q()q2.connector = 'OR'q2.children.append(('c1', 1))q2.children.append(('c1', 10))q2.children.append(('c1', 9))con.add(q1, 'AND')con.add(q2, 'AND')models.Tb1.objects.filter(con)

exclude(self, *args, **kwargs)

    # 条件查询# 条件可以是:参数,字典,Q

select_related(self, *fields)

     性能相关:表之间进行join连表操作,一次性获取关联的数据。model.tb.objects.all().select_related()model.tb.objects.all().select_related('外键字段')model.tb.objects.all().select_related('外键字段__外键字段')

prefetch_related(self, *lookups)

    性能相关:多表连表操作时速度会慢,使用其执行多次SQL查询  在内存中做关联,而不会再做连表查询# 第一次 获取所有用户表# 第二次 获取用户类型表where id in (用户表中的查到的所有用户ID)models.UserInfo.objects.prefetch_related('外键字段')

annotate(self, *args, **kwargs)

    # 用于实现聚合group by查询from django.db.models import Count, Avg, Max, Min, Sumv = models.UserInfo.objects.values('u_id').annotate(uid=Count('u_id'))# SELECT u_id, COUNT(ui) AS `uid` FROM UserInfo GROUP BY u_idv = models.UserInfo.objects.values('u_id').annotate(uid=Count('u_id')).filter(uid__gt=1)# SELECT u_id, COUNT(ui_id) AS `uid` FROM UserInfo GROUP BY u_id having count(u_id) > 1v = models.UserInfo.objects.values('u_id').annotate(uid=Count('u_id',distinct=True)).filter(uid__gt=1)# SELECT u_id, COUNT( DISTINCT ui_id) AS `uid` FROM UserInfo GROUP BY u_id having count(u_id) > 1

extra(self, select=None, where=None, params=None, tables=None, order_by=None, select_params=None)

        # 构造额外的查询条件或者映射,如:子查询Entry.objects.extra(select={'new_id': "select col from sometable where othercol > %s"}, select_params=(1,))Entry.objects.extra(where=['headline=%s'], params=['Lennon'])Entry.objects.extra(where=["foo='a' OR bar = 'a'", "baz = 'a'"])Entry.objects.extra(select={'new_id': "select id from tb where id > %s"}, select_params=(1,), order_by=['-nid'])

reverse(self):

        # 倒序models.UserInfo.objects.all().order_by('-nid').reverse()# 注:如果存在order_by,reverse则是倒序,如果多个排序则一一倒序

下面两个 取到的是对象,并且注意 取到的对象可以 获取其他字段(这样会再去查找该字段降低性能
defer(self, *fields):

        models.UserInfo.objects.defer('username','id')或models.UserInfo.objects.filter(...).defer('username','id')# 映射中排除某列数据

only(self, *fields):

        # 仅取某个表中的数据models.UserInfo.objects.only('username','id')或models.UserInfo.objects.filter(...).only('username','id')

执行原生SQL

            1.connectionfrom django.db import connection, connectionscursor = connection.cursor()  # cursor = connections['default'].cursor()django的settings中的db配置 ' default',指定数据库cursor.execute("""SELECT * from auth_user where id = %s""", [1])row = cursor.fetchone()2 .extraEntry.objects.extra(select={'new_id': "select id from tb where id > %s"}, select_params=(1,), order_by=['-nid'])3 . rawname_map = {'a':'A','b':'B'}models.UserInfo.objects.raw('select * from xxxx',translations=name_map)

转载于:https://www.cnblogs.com/big-handsome-guy/p/8533908.html

Django的model查询操作 与 查询性能优化相关推荐

  1. Oracle数据库多表连接查询操作以及查询操作的补充

    文章目录 一.查询语句概述 1.查询语句基本语法格式 2.伪表和伪劣 二.单表查询 1.select子句 2.FROM子句 3.WHERE子句 4.DISTINCT关键字 5.GROUP BY子句与聚 ...

  2. MySQL-数据查询操作-基本查询-条件查询-排序查询

    文章目录 ==基础查询== 语法.特点.注意事项 案例 ==条件查询== 语法 按条件表达式筛选 按逻辑表达式筛选 模糊查询 ==排序查询== 语法特点 案例 基础查询 案例所使用表字段介绍: 语法. ...

  3. mongodb 查询操作,条件查询,where,find等常用操作

    此为项目中实际用到的例子 假设有User表 #<User _id: 5497793c73616e2a0c010000, created_at: "2014-12-22T01:51:56 ...

  4. javaweb的struts2的分页查询操作

    javaweb的struts2的分页查询操作 分页查询的实现: 1.利用action完成 action有成员变量: 除了实体对象的属性还有 // 分页显示 public int totalRecord ...

  5. SpringBoot整合thymeleaf之模糊查询操作模块

    SpringBoot整合thymeleaf之模糊查询操作模块 引言 1.一般情况下,Mybatis的模糊查询操作 模糊查询操作 2.在实战中的模糊查询操作 web页面提交数据 <form act ...

  6. 31-32 python mysql-connector创建数据、crud,where,排序,删除等。PyMSQL驱动,插入操作、查询操作、更新操作、删除操作、执行

    31Python MysSQL - mysql-connector驱动 使用pip命令安装mysql-connector: python -m pip install mysql-connector ...

  7. JDBC数据库查询操作

    以下是按正常的数据库查询操作(没有做优化),代码如下: package com.test.main;import java.sql.Connection; import java.sql.Result ...

  8. 云计算学习素材框架,msyql查询操作课件

    在本篇文章中将给大家讲解下msyql查询操作: 查询 简单查询:select * from '表名'; 避免重复:select distinct '字段' from '表名'; 条件查询:select ...

  9. DQL数据库查询操作(入门)

    (tip:sql脚本在文末尾) DQL-数据库查询操作 1 查询基础 1.1 select 操作 #查询所有学生信息 SELECT * FROM student#查询学生表中的学号与姓名 SELECT ...

最新文章

  1. 句柄与指针的区别与联系
  2. 构建全程电子商务,创新企业经营模式(2)
  3. Activiti数据库
  4. linux时间字符串转正常时间
  5. exists用法_SQL中的ALL、ANY和SOME的用法介绍
  6. 阿里云张毅萍:构建边缘云全站加速网络体系
  7. 树莓派AI视觉云台——6、Linux常用命令及vim编辑器的使用
  8. LeetCode 2116. 判断一个括号字符串是否有效(栈)
  9. [数据库]---mysql 插入sql之 INSERT INTO和INSERT IGNORE INTO和REPLACE INTO和ON DUPLICATE KEY UPDATE比较应用
  10. IDEA——修改idea64.exe.vmoptions文件解决coding卡顿问题
  11. Python案例:格式化输出斐波拉契数列
  12. 【Elasticsearch】了解Elasticsearch写入磁盘的数据
  13. IOS开发 ios7适配
  14. 6.凤凰架构:构建可靠的大型分布式系统 --- 分布式共识
  15. 又延伸到socket去了。
  16. HBuilderX里面创建项目时没有模板解决方案
  17. 百度网盘破解版Pandownload开发者被抓
  18. python-pptx---插入表格
  19. 超简单集成华为HMS Scankit 扫码SDK实现扫一扫二维码
  20. 9月份入读哈工大计算机研究生了

热门文章

  1. 全国计算机一级知识题及答案解析,全国计算机等级考试一级试题库大全完整版附参考答案...
  2. 小数前的0在html不显示,jsp小数显示问题 例如 我在oracle 数据库中查询出来的是 0.01 但是在jsp页面上就显示成 .01 没有前面的0...
  3. int64 java_为什么json 不能使用 int64类型
  4. leetcode怎么用时间刷_刷完700多题后的首次总结:LeetCode应该怎么刷?
  5. php 秒杀并发怎么做,PHP实现高并发下的秒杀功能–Laravel
  6. linux强制回收内存,Linu系统cache强制回收
  7. python中sorted的用法append_python sorted()排序详解
  8. 搬运机器人举杯贺所需的条件_智能搬运机器人比赛规则
  9. http 二进制_浅谈HTTP协议
  10. css中的node.js_在Node App中使用基本HTML,CSS和JavaScript