ide*_*ist 5 python database django performance django-mptt
我正在创建一个将同步两个数据库的脚本.数据库中有一个数据应该存储为树,所以我使用django-mptt作为新数据库.当我同步DB时,我从旧数据库中选择新数据,并将其保存在新数据库中.
我想知道是否有更好的方法将新节点添加到树中?现在看起来是下一个方式:
...
# Add new data to DB
for new_record in new_records:
# Find appropriate parent using data in 'new_record'
parent = get_parent(new_record)
# Create object which should be added using data in 'new_record'
new_node = MyMPTTModel(...)
new_node.insert_at(parent, save = True)
# Similar to:
# new_node.insert_at(parent, save = False)
# new_node.save()
Run Code Online (Sandbox Code Playgroud)
但它工作得很慢.我认为它以这种方式工作,因为每次调用该insert_at(..., save = True)方法后都django-mptt应该将新节点写入数据库并修改已经存在于数据库中的记录left和right键.
有没有办法在django-mptt每次调用时修改查询insert_at,然后在我打电话时将所有更改应用到一起save?或者你知道如何减少执行时间吗?
提前致谢.
cra*_*gds 13
首先,不要使用insert_at.这不是性能缓慢的原因,但这是不必要的,看起来很难看.刚设置node.parent:
for new_record in new_records:
new_node = MyMPTTModel(..., parent=get_parent(new_record))
new_node.save()
Run Code Online (Sandbox Code Playgroud)
现在为性能问题.如果您使用的是最新的mptt(git master,而不是0.5.4),那么delay_mptt_updates在您添加所有节点之前,会调用一个上下文管理器来阻止mptt进行大量的更新:
with transaction.atomic():
with MyMPTTModel.objects.delay_mptt_updates():
for new_record in new_records:
new_node = MyMPTTModel(..., parent=get_parent(new_record))
new_node.save()
Run Code Online (Sandbox Code Playgroud)
或者,如果你几乎触摸整个树,你可以通过最后使用disable_mptt_updates和重建整个树来加快速度:
with transaction.atomic():
with MyMPTTModel.objects.disable_mptt_updates():
for new_record in new_records:
new_node = MyMPTTModel(..., parent=get_parent(new_record))
new_node.save()
MyMPTTModel.objects.rebuild()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2182 次 |
| 最近记录: |