在Django中聚合save()? - python

我正在使用带有sqlite后端的Django,并且写入性能是一个问题。在某个阶段,我可能会毕业于“适当的”数据库,但是目前我仍然坚持使用sqlite。我认为我的写入性能问题可能与以下事实有关:我创建了大量行,并且大概每次save()一个行时,它都会锁定,解锁和同步磁盘上的数据库。

如何将大量save()调用聚合到一个数据库操作中?

参考方案

编辑:不建议使用commit_on_success,并在Django 1.8中将其删除。请改用transaction.atomic。参见弗雷泽·哈里斯(Fraser Harris)的answer。

实际上,这比您想的容易。您可以在Django中使用transactions。将这些批处理数据库操作(特别是保存,插入和删除)合并为一项操作。我发现最容易使用的是commit_on_success。本质上,您将数据库保存操作包装到一个函数中,然后使用commit_on_success装饰器。

from django.db.transaction import commit_on_success

@commit_on_success
def lot_of_saves(queryset):
    for item in queryset:
        modify_item(item)
        item.save()

这将有巨大的速度增加。如果其中任何一项失败,您还将获得回滚的好处。如果您有数百万次保存操作,则可能必须使用commit_manuallytransaction.commit()在块中提交它们,但我很少需要它。

希望能有所帮助,

如何在Linux上安装2个Anacondas(Python 2.7和3.5)? - python

我想使用Python 2和3版本。我已经读过有关conda环境的用法,但是不断向终端source (de)activate py27写入内容似乎不方便。如picture所示,如何使用命令选择内核版本? 参考方案 您在该图像中寻找的是Jupyter Notebook。您需要使用Jupyter和所需的python版本创建环境:conda create -n py…

为什么在for循环中将单词从复数形式转换为单数形式会花费这么长时间(Python 3)? - python

这是我的代码,用于从CSV文件读取文本并将一列中的所有单词从复数形式转换为单数形式:import pandas as pd from textblob import TextBlob as tb data = pd.read_csv(r'path\to\data.csv') for i in range(len(data)): blob …

如何在“后台”中运行脚本的一部分(单个函数)? - python

我在具有以下基本结构(伪代码)的服务器上运行python脚本:for data_item in data_items: processed_result=process_data(data_item); #this takes time T0 upload_result_to_site(processed_result) #this takes time T…

为什么在Python中根据@staticmethod选择模块级别的函数(根据Google样式指南)? - python

根据《 Google Python样式指南》,绝对不应(几乎)使用静态方法: 除非为了与 在现有库中定义的API。编写模块级功能 代替该建议背后的原因是什么?这是否仅适用于Google?还是在Python中使用静态方法还有其他(更一般的)缺点?尤其是,如果我想在将由该类的其他公共成员函数调用的类中实现实用程序功能,则最佳实践是什么?class Foo: ..…

将package_dir设置为..? - python

我有一个克隆到myproject的Git存储库,该存储库的根目录中有一个__init__.py,使整个东西成为可导入的Python包。我正在尝试为该软件包编写setuptools setup.py,它也将位于存储库的根目录中,在__init__.py文件旁边。我希望setup.py将其作为软件包安装在目录中。如果setup.py本身作为安装的一部分出现,那很…