如何在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,依此类推……
这可能吗?
我能找到的只有reset
和sqlclear
,它们都已弃用。 flush
删除了数据库中的所有数据,因此不是我想要的
我确实承认这是一件奇怪的事情,但这是给我的手……
【问题讨论】:
据我所知,分发id
s 是在数据库层发生的事情,因此 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 替换. 然后将结果重新导入到干净的数据库中?
id
s 由 postgresql 自动递增,根据this answer,您可以重置索引序列,但甚至不确定它是否可以回到 1。
但实际上重置索引的意义何在?
【讨论】:
部分索引用作项目的序列号。经理希望他们回到最简单的 1 或 1000。以上是关于如何在Django中删除一个且只有一个应用程序的所有数据的主要内容,如果未能解决你的问题,请参考以下文章