mysql bulkupdate_django_bulk_update源码分析

mysql bulkupdate_django_bulk_update源码分析##django_bulk_update源码分析这个第三方插件的体量几乎只相当于工作时两三天的代码量了,是一个比较容易开始进行源代码阅读的模块,阅读完这个代码对自定义的进行django拓展也是一个相当好的借鉴###django_bulk_update文件结构django_bulk_update在被调用时实际只有四个文件,分别是1.\_\_init__.py2.helper.py3.man…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全家桶1年46,售后保障稳定

## django_bulk_update源码分析

这个第三方插件的体量几乎只相当于工作时两三天的代码量了,是一个比较容易开始进行源代码阅读的模块,阅读完这个代码对自定义的进行django拓展也是一个相当好的借鉴

### django_bulk_update文件结构

django_bulk_update在被调用时实际只有四个文件,分别是

1. \_\_init__.py

2. helper.py

3. manager.py

4. query.py

### \_\_init__.py文件

__init__文件是所有要被调用的python模块都有的文件,里面的代码只是对当前的模块版本进行了指定

~~~py

# __init__.py

__version__ = ‘2.2.0’

~~~

### helper.py文件

此模块的主要文件,bulk_update功能就在此文件里

~~~py

def validate_fields(meta, fields):

fields = frozenset(fields)

field_names = set()

for field in meta.fields:

if not field.primary_key:

field_names.add(field.name)

if field.name != field.attname:

field_names.add(field.attname)

non_model_fields = fields.difference(field_names)

if non_model_fields:

raise TypeError(

“These fields are not present in “

“current meta: {}”.format(‘, ‘.join(non_model_fields))

)

~~~

validate_fields是一个对bulk_update中需要修改的字段做校验的方法,这里的传入的两个参数,meta可以看做就是django中模型类的_meta属性(实验了一下后发现正常使用时传进去的的确是Option类),也就是一个Options类,fields即用户输入的想要修改的字段名字符串数组

可以看到这里对输入的原始fields数组做了一个frozenset备份,在校验完成后和这些字段中符合逻辑的集合进行差集运算,只要fields集合不是field_names集合的子集则马上抛出TypeError异常,这里的for循环主要处理的就是meta中的fields,根据判断条件可以看出,bulk_update功能**是不支持主键修改的**

~~~py

def get_fields(update_fields, exclude_fields, meta, obj=None):

deferred_fields = set()

if update_fields is not None:

validate_fields(meta, update_fields)

elif obj:

deferred_fields = obj.get_deferred_fields()

if exclude_fields is None:

exclude_fields = set()

else:

exclude_fields = set(exclude_fields)

validate_fields(meta, exclude_fields)

exclude_fields |= deferred_fields

fields = [

field

for field in meta.concrete_fields

if (

not field.primary_key and

field.attname not in deferred_fields and

field.attname not in exclude_fields and

field.name not in exclude_fields and

(

update_fields is None or

field.attname in update_fields or

field.name in update_fields

)

)

]

return fields

~~~

get_fields方法看起来比较长,实际上在做的事情比较单调,依然是通过meta参数指向的Options类进行字段筛选,需要注意的是这里的筛选条件比较多,写法相对复杂

~~~py

def grouper(iterable, size):

# http://stackoverflow.com/a/8991553

it = iter(iterable)

while True:

chunk = tuple(itertools.islice(it, size))

if not chunk:

return

yield chunk

~~~

实际上今天碰到的问题就是依靠这个方法来解决的,因为业务代码中数据库中有10W+的数据,如果直接使用all()拿到所有数据然后不做其他处理进行bulk_update,则因为单条SQL语句处理的数据量过大导致Jenkins集成时django报ProgrammingError,提示mysql server gone away,实际上就是处理超时,这里同事给的解决办法就是使用batch_size参数处理这个问题,将数据分成500条一个的chunk块来进行更新,而bulk_udpate支持的batch_size参数就是在这个方法里实现了chunk分块,这里使用了iter方法将需要更新的对象列表转化为了一个迭代器,通过islice给迭代器分片,最后形成一个生成器供使用,这样就解决了分块批量修改数据的需求

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/222752.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 51单片机智能小车的通俗易懂讲解「建议收藏」

    51单片机智能小车的通俗易懂讲解「建议收藏」..从上面导航图,我们可以看到,智能小车,共分为三步外部检测,控制中心,轮子输出控制。等于人的眼睛,大脑,手脚。..因为控制中心和轮子输出控制是一样的,只有前面的外部检测,换个模块工作而已。…..在这里我们先简单了解一下,上面两个外部检测,可以扩展什么功能。,.红外线类循迹避障循迹加避障等等..超声波类避障魔法手舵机式避障等等…..

    2022年5月8日
    56
  • 平庸前端码农之蜕变 — AST

    平庸前端码农之蜕变 — AST前言首先,先说明下该文章是译文,原文出自《ASTforJavaScriptdevelopers》。很少花时间特地翻译一篇文章,咬文嚼字是件很累的事情,实在是这篇写的太棒了,所以忍不住想和大家一起分享。该译文出自我的博客:github.com/CodeLittleP…,我的博客会不定时更新各种类型文章,希望大家支持。OK,我们直接进入正题。为什么要谈AST(抽象语法树)?如果你查看目…

    2022年7月21日
    13
  • java基础—悲观锁和乐观锁

    java基础—悲观锁和乐观锁

    2020年11月12日
    207
  • 周鸿祎的真经「建议收藏」

    周鸿祎的真经「建议收藏」  什么样的产品易获风险投资商的青睐-周鸿祎的BLOG-搜狐博客 无论如何,产品还是企业最核心最根本的东西。产品决定了创业者选择一条什么样的发展道路。产品的定义和选择是创业的开始,而好的开始是成功的一半。 做一份投资计划书-周鸿祎的BLOG-搜狐博客 一份好的投资计划书,不仅有助于将创业者头脑中的创意、想法逻辑化

    2022年7月26日
    11
  • 分布式锁的应用场景和三种实现方式的区别_负载均衡策略

    分布式锁的应用场景和三种实现方式的区别_负载均衡策略多线程对同一资源的竞争,需要用到锁,例如Java自带的Synchronized、ReentrantLock。但只能用于单机系统中,如果涉及到分布式环境(多机器)的资源竞争,则需要分布式锁。分布式锁的主要作用:保证数据的正确性:比如:秒杀的时候防止商品超卖,表单重复提交,接口幂等性。避免重复处理数据:比如:调度任务在多台机器重复执行,缓存过期所有请求都去加载数据库。分布式锁的主要特性:互斥:同一时刻只能有一个线程获得锁。可重入:当一个线程获取锁后,还可以再次获取这个锁,避免死锁发生。高可用:当

    2025年10月5日
    3
  • bwapp安装教程_下载安装

    bwapp安装教程_下载安装1、什么是BWAPP?这就不用多说了吧,天知地知,你知我知。直接走下一步。2、去哪里下载?https://sourceforge.net/projects/bwapp/,进去点击download下载。3、打开BWAPP直接双击下面这个文件打开就可以了,打开后就是这个样子4、查看虚拟机ip,5、浏览器访问:http://192.168.43.116/b…

    2025年11月30日
    7

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号