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

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第三方库


热门话题
JAVAexe jar文件读取txt文件,但内容在不同的计算机中都被破坏(显示外来语言..)   java BufferedReader提供缺少的字符   java我希望全局捕获所有可能的安卓异常,以便应用程序无法关闭   java MATLAB JA Builder   java如何将一副牌一分为二?   字典在Java中使用映射条目时出错   Java命令提示符仿真器   java HC06蓝牙模块   如何在java中获得与CallableStatement一起使用的完全限定SQL类型名。registerOutParameter   java如何为文件中的每一行整数创建数组   java从文本框传递参数   java如何将参数传递到工厂以创建对象?   java JSP无法执行脚本标记中包含的javascript函数