Django:从数据库中安全地删除未使用的表

Posted

技术标签:

【中文标题】Django:从数据库中安全地删除未使用的表【英文标题】:Django: safely deleting an unused table from database 【发布时间】:2020-09-01 04:41:45 【问题描述】:

在我的 django 应用程序中,我曾经利用基础 django rest 框架身份验证令牌来验证用户身份。现在我已经切换到 Json Web Token,但是浏览我的 psql 数据库时,我注意到了用于存储的表 authtoken_token DRF 身份验证令牌仍然存在。我想知道如何摆脱它。我考虑了 2 个选项:

    通过迁移删除它:我认为这是正确且更安全的方法,但在我的项目文件夹内的 migrations 目录中,我没有找到与令牌相关的任何内容。仅与我的模型相关的内容; 直接从数据库中删除它可能是另一种选择,但我害怕弄乱 django 迁移(尽管它不应再与其他表有链接)

我必须澄清一下,我已经从我的 INSTALLED_APPS

中删除了 rest_framework.authtoken

【问题讨论】:

【参考方案1】:

要删除 authtoken 表,您可以通过以下方式使用 django 的迁移命令:

python manage.py migrate authtoken zero

这将恢复来自 authtoken 应用程序的所有迁移,有效地从数据库中删除表(只要这不会破坏任何约束)。

zero 迁移可用于任何已安装的 django 应用 (see relevant django documentation)。

运行零迁移后,您可以将应用从INSTALLED_APPS中删除

【讨论】:

我可以在运行你的命令后删除 authtoken 文件吗?正如上一个答案的 #2#3 点所建议的那样? @dc_Bita98 是的,该命令将删除与 authtoken 应用关联的数据库表。然后,您可以从代码中删除所有引用(INSTALLED_APPS 等)。我将更新答案以澄清:) 我认为这应该是正确的处理方式,但我之前已经从我的 INSTALLED_APPS 中删除了 rest_framework.authtoken,所以当我运行时该命令,我收到以下错误CommandError: No installed app with label 'authtoken' 迁移只能针对已安装的应用程序运行。运行命令后,可以将应用从 INSTALLED_APPS 设置中删除。【参考方案2】:

您可以选择第一个选项。您应该执行 3 个步骤来完成从 Django 应用程序中卸载 authtoken

    INSTALLED_APPS 中删除 rest_framework.authtoken,此操作将告诉您的 Django 应用不要从该模块获取任何迁移文件 删除authtoken_token 表,如果你愿意的话 在表django_migrations中找到应用名authtoken的记录,可以删除。

注意:您的代码中出现了几个错误,因为authtoken 模块已从您的INSTALLED_APPS 中删除。我的建议,在执行上述步骤之前先备份您现有的数据库

【讨论】:

我建议阅读此问题的任何人也遵循此答案,因为它提供了完全删除应用程序的其他必要步骤。谢谢

以上是关于Django:从数据库中安全地删除未使用的表的主要内容,如果未能解决你的问题,请参考以下文章

Django为同一模型创建不同的表

如何安全地删除未保存的托管对象?

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

Django没有这样的表

Django 1.7 迁移不会重新创建删除的表,为啥?

如何使用 django-south 恢复删除的表?