如何从 DJango 的 SQLite3 中删除表?

Posted

技术标签:

【中文标题】如何从 DJango 的 SQLite3 中删除表?【英文标题】:How do I drop a table from SQLite3 in DJango? 【发布时间】:2011-01-18 04:20:15 【问题描述】:

我做了一个模型,然后运行了 python manage.py syncdb。我认为这在数据库中创建了一个表。然后我意识到我做了一个错误的列,所以我改变了它,并运行了相同的命令,认为它会删除旧表,并添加一个新表。

然后我去python manage.py shell,并尝试运行.objects.all(),它失败了,说那个列不存在。

我想清除旧表,然后再次运行syncdb,但我不知道该怎么做。

【问题讨论】:

这是设计使然。同步变更和掉落会打开一大罐蠕虫。乔治有你正确的答案。 【参考方案1】:

可能值得在这里扩展一些答案:

因此,您可以使用以下命令访问dbshell

python manage.py dbshell

然后优先使用以下内容:

DROP TABLE appname_tablename CASCADE;

要删除任何相关表,有效地镜像字段上的“on_delete=CASCADE”方向。

【讨论】:

【参考方案2】:

在 Django 2.1.7 中,我在 SQLite browser 中打开了 db.sqlite3 文件(Pypi 上还有一个 Python 包)并使用命令删除了表

DROP TABLE appname_tablename;

然后

DELETE FROM django_migrations WHERE App='appname';

然后再次运行

python manage.py makemigrations appname
python manage.py migrate appname

【讨论】:

删除整个迁移文件夹使这项工作成功【参考方案3】:

在 Django 1.9 中,我必须执行 Kat Russo 的步骤,但第二次迁移有点棘手。你必须跑

./manage.py migrate --run-syncdb

【讨论】:

这很有帮助【参考方案4】:

在使用 Django 1.4 或更低版本时,另一种简单的方法是

python manage.py reset app_name

删除并重新创建此应用模型使用的表。

这在 Django 1.3 中已被弃用,在 Django 1.5 中不再可用

【讨论】:

这是我使用的解决方案。完美运行。 重置命令在 Django 1.3 中已被弃用,在 Django 1.5 中不再可用。请检查我的答案。 当前版本支持:: python manage.py reset_db【参考方案5】:

没有一个答案显示如何只删除应用程序中的一个表。这不是太难。 dbshell 命令将用户登录到 sqlite3 shell。

python manage.py dbshell

当您在 shell 中时,键入以下命令以查看数据库的结构。这将显示数据库中的所有表名(以及表中的列名)。

SELECT * FROM sqlite_master WHERE type='table';

通常,Django 根据以下约定命名表:“appname_modelname”。因此,实现目标的 SQL 查询将类似于以下内容:

DROP TABLE appname_modelname;

这应该足够了,即使该表与其他表有关系。现在您可以通过执行以下命令退出 SQLITE shell:

.exit

如果你再次运行 syncdb,Django 将根据你的模型重建表。这样,您可以在不丢失所有应用程序数据的情况下更新数据库表。如果您经常遇到此问题,请考虑使用 South - 一个将为您迁移表的 django 应用程序。

【讨论】:

你在这里有更多版本证明的基本原则答案。我只是补充一下,您需要安装 sqlite3。 非常感谢你提到dbshell——我以前用过shell,但是在将我的数据库换成mysql之后,它似乎不允许我访问我的模型了。 dbshell 现在将我直接插入到我的 mysql shell 中——非常酷。 来自 Schdiewie Kay 的回答:按照上述所有步骤操作后,为 Django 1.9+ 运行“manage.py migrate --run-syncdb”而不是“syncdb”【参考方案6】:

我遇到了同样的问题。

为了快速解决(如果您不关心丢失表/数据),请使用所需的数据类型更正您的 models.py 文件,删除 Migration 文件夹和 db.SQLite3 文件,

然后重新运行以下命令:

    python manage.py 迁移 python manage.py makemigrations python manage.py 迁移 python manage.py createsuperuser(创建管理员用户/pswd 来管理管理员页面) python manage.py runserver

【讨论】:

这是我可以开始工作的唯一解决方案。谢谢! 这似乎是唯一可行的解​​决方案。被严重低估的答案。 是的,这真的很有帮助,谢谢。但是当我删除迁移文件夹时,makemigrations 命令无法识别我的模型。所以我不得不重新创建该文件夹并将__init__.py 放入其中,然后一切正常。 @kat Russo 如果不想删除数据怎么办? @NoMercy 下次尝试'python manage.py makemigrations appname'【参考方案7】:

使用

获取 DROP 语句

python manage.py sqlclear app_name

那就试试

python manage.py dbshell

并执行 DROP 语句

查看http://docs.djangoproject.com/en/dev/ref/django-admin/

【讨论】:

这是我想出来的答案。谢谢你。碰巧重置命令效果很好。【参考方案8】:

清除应用程序就像编写一样简单:

./manage.py sqlclear app_name | ./manage.py dbshell 

然后为了重建您的表,只需输入:

./manage.py syncdb

【讨论】:

终于找到了解决办法。谢谢 在 Django 1.9+ 中不再工作:Deprecations in Django 1.9

以上是关于如何从 DJango 的 SQLite3 中删除表?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Swift 从 tableview 和 sqlite3 中删除

如何使用 Django 中的 manage.py CLI 从数据库中删除所有表?

如何在 sqlite3 中正确导入和配置 .csv 表

如何从Django模型中的数据库表名中删除后缀's',这是由Djanog自动添加的

将 Django 数据库:SQLITE3 更改为 MARIADB

Python sqlite3 参数化删除表