将批量添加、更新和删除合并到一个调用中。

django-bulk-sync的Python项目详细描述


django批量同步

将批量创建、更新和删除合并到一个调用中。

django-bulk-sync是django orm的一个包,它将bulk-create、bulk-update和delete组合到对bulk_sync的单个方法调用中。

<>它用尽可能少的数据库调用来管理所有必要的创建、更新和删除,以使性能最大化。

安装

该包在pip上可用作[django bulk sync][django bulk sync]。运行:

pip install django-bulk-sync

然后通过导入:

from bulk_sync import bulk_sync

使用场景

公司没有或有更多的雇员。您希望有效地同步来自该公司的导入的单个Company的所有员工的姓名,但有些是添加、更新或删除的。这种简单的方法效率低下--逐行读取导入,然后:

对于n个记录中的每一个:

    选择检查员工的存在
  • 如果存在,插入,如果它不

然后找出一些方法来识别丢失的内容并删除它。与通常的情况一样,这个过程的速度主要由运行的查询数控制,这里每个记录大约有两个查询,所以o(n)。

相反,使用bulk_sync,我们可以避免查询的o(n)个数,并简化我们必须编写的逻辑。

示例用法

fromdjango.db.modelsimportQfrombulk_syncimportbulk_syncnew_models=[]forlineincompany_import_file:# The `.id` (or `.pk`) field should not be set. Instead, `key_fields` # tells it how to match.e=Employee(name=line['name'],phone_number=line['phone_number'],...)new_models.append(e)# `filters` controls the subset of objects considered when deciding to # update or delete.filters=Q(company_id=501)# `key_fields` matches an existing object if all `key_fields` are equal.key_fields=('name',)ret=bulk_sync(new_models=new_models,filters=filters,key_fields=key_fields)print("Results of bulk_sync: ""{created} created, {updated} updated, {deleted} deleted.".format(**ret['stats']))

在引擎盖下,它将自动调用bulk_createbulk_update和单个querysetdelete()调用,以正确有效地更新筛选出的公司的所有员工的所有字段,并使用name进行正确匹配。

参数引用

def bulk_sync(new_models, key_fields, filters, batch_size=None): 合并批量创建、更新和删除。使数据库与内存中的一组对象匹配。

  • new_models:要存储在数据库中的django ormModel对象的一个iterable。它们可能有也可能没有id集,但您不应该已经对它们调用save()
  • key_fields:标识属性名以将new_models项与数据库行匹配。如果外键用作键字段,请确保传递的是fieldname_id,而不是fieldname
  • filters:q()过滤器,指定要在其中工作的数据库的子集。
  • batch_size:传递给djangobulk_create.batch_sizebulk_update.batch_size,并控制每个sql查询创建/更新多少对象。

def bulk_compare(old_models, new_models, key_fields, ignore_fields=None): 通过key_fields比较两组模型。

  • old_models:可比较的django orm对象。
  • new_models:可比较的django orm对象。
  • key_fields:标识属性名以将new_models项与数据库行匹配。如果外键 正在用作键字段,请确保传递fieldname_id,而不是fieldname
  • ignore_fields:(可选)如果已设置,请提供比较对象时不应考虑的字段名。
  • 返回dict of:{ 'added': list of all added objects. 'unchanged': list of all unchanged objects. 'updated': list of all updated objects. 'updated_details': dict of {obj: {field_name: (old_value, new_value)}} for all changed fields in each updated object. 'removed': list of all removed objects. }

支持的框架

这个库使用Python3对Django1.11和Django2.2进行测试。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java在活动中显示转换的文件   java如何在每小时开始时使用Quartz启动cron?   用于以编程方式删除所有注释的Java正则表达式   oracle EXP实用程序通过Java仅导出少数表   java如何计算太阳黑子的方向和速度?   java为给定时间安排作业   java Linux IntelliJ Chrome WebDriverManager“Chrome(或任何其他浏览器)无法启动”   从数据包头设置Java字节数组大小的socket   java docx4j:使用Eclipse导出时,文档中的所有样式都会消失   java无法在更新通知后取消通知   java将自定义对象绑定到JMS映射消息   java是泛型堆栈构造函数的BigO   java Netbeans API:如何保存当前项目中的一个文件或所有文件?   java使用Hibernate envers时,什么可能导致奇怪的属性解析错误?   foreach使用Collection时Java ConcurrentModificationException背后的原因。删除()   mongodb Java:从Json文档读取单个值