Django 1.6:清除一张表中的数据

Posted

技术标签:

【中文标题】Django 1.6:清除一张表中的数据【英文标题】:Django 1.6: Clear data in one table 【发布时间】:2014-08-17 07:46:15 【问题描述】:

我有一个表名 UGC,想清除该表中的所有数据。我不想重置整个应用程序,这也会删除所有其他模型中的所有数据。是否可以只清除一个模型?如果有帮助,我还为我的应用程序配置了 South。

【问题讨论】:

【参考方案1】:

你可以use raw SQL:

 cursor.execute(“DROP TABLE UGC”)

或者你可以直接在 Django shell 中使用 ORM:

UGCModel.objects.all().delete()

这会删除数据(但不是表格),所以你必须小心:)

另一种方法(为了完整性和利用 South)是在模型声明中注释掉模型,迁移然后再放回去(假设没有模型引用它。)

HTH

【讨论】:

【参考方案2】:

在管理界面中,您可以转到该模型的列表页面,然后您可以选择所有模型并使用表格顶部的Delete selected ... 操作。

请记住,无论您以何种方式删除数据,外键默认为ON DELETE CASCADE,因此任何具有您要删除的模型的外键的模型也将被删除。管理界面将为您提供将被删除的模型的完整概述。

【讨论】:

很高兴指出级联的事情,但要小心管理员删除的操作:如果您有很多(我的意思是很多)对象,这将花费相当长的时间并不必要地消耗资源。 @Ambroise 为什么会这样?删除日志真的会占用资源吗? 我曾尝试以这种方式删除 80k 个对象:行为是遍历所有项目并为每个项目调用 model_instance.delete(),而模型管理器的方法 Model.objects.delete()是批量删除(一次全部删除)。一旦达到一千个对象,我建议不要使用此方法,否则它是一种可行且方便的方法。 @Ambroise 从 Django 1.1 开始,删除操作在查询集上调用 delete() 方法。但是,它确实会遍历查询集并记录每个单独模型实例的删除。与单独删除每个对象相比,此迭代消耗的资源几乎没有,但我可以看到如果查询集那么大,它可能会给您的系统带来多大压力。 嗯,我误解了等待时间(以及偶尔的低规格服务器,关机),我的错 :) 谢谢你的解释!【参考方案3】:

今天在使用 django 2.0.2 时遇到了此类问题,因为我创建了我的模型

class Front(models.Model):
    pass

并迁移了它,但是当我后来更新模型时,我无法运行 python manage.py makemigrations 因为它在说

You are trying to add a non-nullable field 'update' to front without a default; we can't do that (the database needs something to populate existing rows).
Please select a fix:
 1) Provide a one-off default now (will be set on all existing rows 
with a null value for this column)
 2) Quit, and let me add a default in models.py
Select an option:

我的解决方案是什么?

    我选择了选项 2,即退出 我注释掉了麻烦的模型/表,在我的例子中是 Front 我运行python manage.py makemigrations 删除了麻烦的表/模型 我取消注释我的模型并再次运行 python manage.py makemigrations,它重新创建了表/模型,最后 我使用 python manage.py migrate 迁移了我的更改,一切都已解决!

注意:请注意上述指令,因为它会删除表/模型的所有引用/外键 on_delete=models.CASCADE 这是默认值!

【讨论】:

以上是关于Django 1.6:清除一张表中的数据的主要内容,如果未能解决你的问题,请参考以下文章

VBA:粘贴范围清除后粘贴功能导致1004错误

Django sql清除所有应用程序

pt-archiver 归档数据

SQL 显示一张表中的数据并计算另一张表中的结果

Clickhouse 将一张表中的数据聚合到另一张表中

Netezza - 用另一张表中的最大数据更新一张表