如何在Django中删除一个且只有一个应用程序的所有数据

Posted

技术标签:

【中文标题】如何在Django中删除一个且只有一个应用程序的所有数据【英文标题】:How to delete all data for one and only one app in Django 【发布时间】:2018-10-20 10:43:53 【问题描述】:

我有一个设置(Django 1.11),其中包含多个应用程序,包括 OOK、EEK 和其他不相关的应用程序。我想删除 OOK 的所有数据,同时保留 EEK(和其余部分)不变。理想情况下,我希望所有主键也被重置,这样第一个新的 OOK 模型将获得 1,依此类推……

这可能吗?

我能找到的只有resetsqlclear,它们都已弃用。 flush 删除了数据库中的所有数据,因此不是我想要的

我确实承认这是一件奇怪的事情,但这是给我的手……

【问题讨论】:

据我所知,分发ids 是在数据库层发生的事情,因此 Django 对此没有什么好说的。您可以使用原始查询来执行此操作,但这可能不是一个好主意。 最简单的方法是使用python manage.py flush,您可以阅读文档docs.djangoproject.com/en/1.11/ref/django-admin/#flush @WillemVanOnsem 我明白了,但这些是我必须遵守的要求。我很高兴处理原始 SQL,并且显然会在将要备份的主数据库上进行测试之前对其进行测试。 @Sardathrion 我的错误我没有正确阅读。所以在我看来,这听起来不太可能,但我会等待这个领域更相关的人的回答。 @Sardathrion:对于 mysql,您可以使用 ***.com/a/8923132/67579 重置索引 【参考方案1】:

我认为您可以实现此行为,删除该<app> 的所有表,然后仅迁移该<app>。这样您将重置<app> 的表。在django 1.7+ 你可以这样做:

$ python manage.py migrate OOK zero //This command unapply your migrations
$ python manage.py migrate OOK

https://docs.djangoproject.com/en/2.0/ref/django-admin/#django-admin-migrate

【讨论】:

这样做不会丢失 OOK 的所有数据吗?除非您也有数据迁移... 是的,但这就是他要求的“...我想删除 OOK 的所有数据...”。不是吗? 这很危险,因为它可能导致其他应用程序中未应用迁移! 不幸的是,如果您的数据迁移没有反向功能,它也不起作用。但是在数据迁移中添加虚拟反向 lambda 函数并不是什么大问题。【参考方案2】:

这对于 django 可能是不可能的。但是,使用原始 SQL 是可行的:

SET FOREIGN_KEY_CHECKS = 0;

TRUNCATE OOK_table1;
TRUNCATE OOK_table2;
[…]

SET FOREIGN_KEY_CHECKS = 1;

⚠ 在此之前请备份您的数据库!

【讨论】:

【参考方案3】:

如果您被允许替换数据库,您可以将您需要的数据导出到一个夹具,然后在其中的 json 中进行一些巧妙的文本处理,例如找到所有 ID 字段并将它们从 1 替换. 然后将结果重新导入到干净的数据库中?

ids 由 postgresql 自动递增,根据this answer,您可以重置索引序列,但甚至不确定它是否可以回到 1。

但实际上重置索引的意义何在?

【讨论】:

部分索引用作项目的序列号。经理希望他们回到最简单的 1 或 1000。

以上是关于如何在Django中删除一个且只有一个应用程序的所有数据的主要内容,如果未能解决你的问题,请参考以下文章

如何删除数组中的所有空数组

如何在压缩它们后删除 django 迁移?

如何递归删除PowerShell中的所有空文件夹?

Django之路- 如何开发通用且万能的的权限框架组件

Django之路- 如何开发通用且万能的的权限框架组件

如何使用 Django Migrations 重新创建已删除的表?