如何从 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 从数据库中删除所有表?
如何从Django模型中的数据库表名中删除后缀's',这是由Djanog自动添加的