一、事务操作


模块 from django.db import transaction

1 开启事务:with transaction.atomic()

from django.db import transaction
class MyView(View):
def post(self, request):
# 在with代码块中开启事务,出了with自动结束事务
with transaction.atomic()
pass

开启事务:@transaction.atomic

class MyView(View):
@transaction.atomic
def post(self, request):
# 整个post方法都在事务中
pass

2 设置事务回滚点

sid = transaction.savepoint() # 可以设置多个

事务回滚

# 回滚整个事务  但是不能在自动提交的事务中使用
transaction.rollback() # 回滚到sid
transaction.savepoint_rollback(sid)

3 事务提交

# 提交整个事务  但是不能在自动提交的事务中使用
transaction.commit() # 释放保存点 sid ,自保存点被创建依赖执行的更改成为事务的一部分
transaction.savepoint_commit(sid) # atomic的事务,只有在事务结束后,才会自动提交到数据库,进行数据的持久化

4 设置事务隔离

配置文件

import psycopg2.extensions

# 根据需要设置隔离级别,如下配置是READ_COMMITTED
# 但是配置PostgreSQL,不能配置mysql,否则会报错
DATABASES = {
# ...
'OPTIONS': {
'isolation_level': psycopg2.extensions.ISOLATION_LEVEL_READ_COMMITTED,
},
}

二、 ORM 惰性查询


即尽量减少对数据库的操作,减轻数据库的压力

1 ORM惰性查询

ORM 内所有的 SQL 查询语句,都是惰性操作,即当你需要使用查询结果时,才会真正去执行 SQL 语句访问数据库,否则是不会执行查询的

可使用代码验证:

2 配置settings文件,使得当执行 SQL 语句时,在终端打印 SQL 命令

LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'console': {
'level': 'DEBUG',
'class': 'logging.StreamHandler',
},
},
'loggers': {
'django.db.backends': {
'handlers': ['console'],
'propagate': True,
'level': 'DEBUG',
},
}
}

3 验证

# 只查询,不使用查询结果
models.User.objects.all() # 将查询结果赋值给变量res,并使用res
res = models.User.objects.all()
print(res) # 分别执行,查看终端的打印结果

三、only与defer


only 查询

  • 指定查询某字段时,将全部结果一次性获取出来,以后再访问该字段数据时,直接从内存中拿即可,不需要再操作数据库,返回QuerySet[obj1, obj2]

defer 查询

  • 指的是一次性获取指定字段之外的所有字段数据,封装到对象中,以后再访问这些字段数据时,直接从内存中拿即可,不需要再操作数据库
class UserTest(models.Model):
id = models.AutoField(primary_key = True)
name = models.CharField(max_length = 32)
age = models.IntegerField()
def __str__(self):
return 'name: %s, age: %s' %(self.name, self.age) models.UserTest.objects.create(name = '小慧',age = '18')
models.UserTest.objects.create(name = '小嘉',age = '19')
models.UserTest.objects.create(name = '小甜',age = '17')
models.UserTest.objects.create(name = '小妞',age = '16') # all 查询
# 访问一次数据库,打印一条sql命令,获取所有的 UserTest 表中的数据
res = models.UserTest.objects.all()
print(res) # only 查询
# 访问一次数据库,打印一条sql命令,仅仅获取 name 的所有数据到内存
res = models.UserTest.objects.only("name")
print(res) for user_obj in res:
print(user_obj.name) # 直接从内存中获取,不访问数据库,不打印 SQl 命令
print(user_obj.age) # 每执行一次,就访问一次数据库,打印一次 SQl 命令 # defer 查询
# 访问一次数据库,打印一条 SQl 命令,获取除了 name 之外的所有数据到内存
res = models.User.objects.defer("name")
for user_obj in res:
print(user_obj.name) # 每执行一次,访问一次数据库,打印一条 SQl 命令
print(user_obj.age) # 直接从内存中获取,不访问数据库,不打印 SQl 命令

注意:分别执行才能看到效果 注释print

四、select_related与prefetch_related


都支持正反向跨表查询,规则等同于基于对象的正反向查询,正向:'外键',反向:'表名小写_set'

select_related:指定外键,连表查询(inner join),获取所有数据到内存,不能指定多对多关系的外键

res = models.Book.objects.select_related('publish')

prefetch_related:指定外键,先查询本表所有数据,再根据外键查询对应的数据表所有数据,相当于子查询,可以指定多个外键,即多个子查询

res = models.Book.objects.prefetch_related('publish')

Django ORM 事务和查询优化的更多相关文章

  1. Django ORM 事务操作

    事务 把一些列的操作(步骤)当作一个事务 全部的步骤都成功才成功 经典例子:银行转账 代码实现: import os if name == 'main': os.environ.setdefault( ...

  2. Django - ORM - 事务, 乐观锁, 悲观锁

    事务 概念 Transaction 事务:一个最小的不可再分的工作单元:通常一个事务对应一个完整的业务(例如银行账户转账业务,该业务就是一个最小的工作单元) 一个完整的业务需要批量的DML(inser ...

  3. Django orm进阶查询(聚合、分组、F查询、Q查询)、常见字段、查询优化及事务操作

    Django orm进阶查询(聚合.分组.F查询.Q查询).常见字段.查询优化及事务操作 聚合查询 记住用到关键字aggregate然后还有几个常用的聚合函数就好了 from django.db.mo ...

  4. Django---Django的ORM的一对多操作(外键操作),ORM的多对多操作(关系管理对象),ORM的分组聚合,ORM的F字段查询和Q字段条件查询,Django的事务操作,额外(Django的终端打印SQL语句,脚本调试)

    Django---Django的ORM的一对多操作(外键操作),ORM的多对多操作(关系管理对象),ORM的分组聚合,ORM的F字段查询和Q字段条件查询,Django的事务操作,额外(Django的终 ...

  5. python 之 Django框架(orm单表查询、orm多表查询、聚合查询、分组查询、F查询、 Q查询、事务、Django ORM执行原生SQL)

    12.329 orm单表查询 import os if __name__ == '__main__': # 指定当前py脚本需要加载的Django项目配置信息 os.environ.setdefaul ...

  6. Django ORM 之F、Q查询与事务

    返回ORM目录 Django ORM 内容目录 一.F.Q查询 二.事务 三.only与defer 一.F.Q查询 """ Product表中的数据: 1 橡皮 2 20 ...

  7. 07 模型层 orm相关查询 F查询Q查询 django开启事务

    一.Django终端打印SQL语句 如果你想知道你对数据库进行操作时,Django内部到底是怎么执行它的sql语句时可以加下面的配置来查看 在Django项目的settings.py文件中,在最后复制 ...

  8. Django ORM那些相关操作

    一般操作 https://docs.djangoproject.com/en/1.11/ref/models/querysets/         官网文档 常用的操作 <1> all() ...

  9. Django ORM相关

    1. ORM 外键关联查询和多对多关系正反向查询 Class Classes(): name = CF class Student(): name = CF class = FK(to="C ...

随机推荐

  1. 5-16 Docker 容器 || Linux

    Docker 简介 Linux简介 Linux和windows一样,都是操作系统 只不过windows更易用,适合家庭和非编程人员使用 如果用作服务器,尤其是java项目的服务器,Linux会更加合适 ...

  2. jdbc 12: 模糊查询

    jdbc连接mysql,进行模糊查询 package com.examples.jdbc.o11_模糊查询; import com.examples.jdbc.utils.DBUtils; impor ...

  3. 【ASP.NET Core】选项模式的相关接口

    在 .NET 中,配置与选项模式其实有联系的(这些功能现在不仅限于 ASP.NET Core,而是作为平台扩展来提供,在其他.NET 项目中都能用).配置一般从多个来源(上一篇水文中的例子,记得否?) ...

  4. 修改 hosts

    不会牛逼操作 -1. 位置.格式 所有系统都差不多,都是 啥啥/etc/hosts 这样的 . 具体去查即可 . 格式: ip + 域名 域名不能含有通配符 hosts 可以绕过 dns 解析,直接访 ...

  5. 【ASP.NET Core】选项类的依赖注入

    咱们继续上一个话题.先简单复习一下,根据老周前面文章的介绍,选项类体系的基本套路是通过 IOptionsFactory 来创建选项类实例的.而我们在服务容器(IServiceCollection)上是 ...

  6. 【定时功能】消息的定时发送-基于RocketMQ

    一.功能介绍 要实现一个消息的定时发送功能,也就是让消息可以在某一天某一个时间具体节点进行发送.而我们公司的业务场景是类似短信的业务,而且数量不小,用户会进行号码.消息内容.定时发送时间等信息的提交. ...

  7. 基于Docker-compose搭建Redis高可用集群-哨兵模式(Redis-Sentinel)

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_110 我们知道,Redis的集群方案大致有三种:1)redis cluster集群方案:2)master/slave主从方案:3) ...

  8. 完成 DolphinScheduler 新手任务赢好礼活动 | 倒计时3 天

    想轻松参与 DolphinScheduler 项目贡献吗? 想获得 500 元京东购物卡吗? 参与活动,有机会得更多活动奖励! 活动截止至6月30日 了解更多详情: 在你参与 DolphinSched ...

  9. Spring源码 18 IOC refresh方法13

    参考源 https://www.bilibili.com/video/BV1tR4y1F75R?spm_id_from=333.337.search-card.all.click https://ww ...

  10. Spring源码 17 IOC refresh方法12

    参考源 https://www.bilibili.com/video/BV1tR4y1F75R?spm_id_from=333.337.search-card.all.click https://ww ...