将批量添加、更新和删除合并到一个调用中。
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_create
、bulk_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_size
和bulk_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进行测试。