如何在Django中从SQLite3中删除表?

59

我创建了一个模型,并运行了 python manage.py syncdb 命令。我认为这在数据库中创建了一张表格。接着我意识到我错误地创建了一列,我进行了更改并再次运行了相同的命令,以为它会删除旧表并添加一个新表。

然后我进入 python manage.py shell,并尝试运行 .objects.all(),但失败了,提示说该列不存在。

我想清除旧表格,然后再次运行 syncdb,但我无法弄清楚如何做到这一点。


1
这是有意为之。同步更改和删除将会引发一系列问题。George 给出了正确的答案。 - Alex
8个回答

72

清除应用程序的方法就像写下这样简单的代码:

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

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

./manage.py syncdb

终于找到了解决方案。谢谢。 - ashim888
12
在Django 1.9及以上版本中不再适用: Django 1.9中的废弃功能 - prokaktus

47

没有任何答案显示如何在应用程序中删除一个表。这并不太困难。 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。 - Arcturus
非常感谢提到dbshell -- 我以前使用过shell,但在将数据库更换为mysql后,它似乎不再允许我访问我的模型。现在dbshell可以直接进入我的mysql shell -- 非常赞。 - twknab
从Schdiewie Kay的回答中:在您按照以上所有步骤操作后,对于Django 1.9+,请运行“manage.py migrate --run-syncdb”而不是“syncdb”。 - NFern

40

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

python manage.py reset app_name

该命令会删除并重新创建此应用程序模型使用的表。

在Django 1.3中已弃用,并且自Django 1.5起不再可用。


这是我使用的解决方案。完美地工作了。 - Alex
38
重置命令已在Django 1.3中弃用,并且从Django 1.5开始不再可用。请检查我的回答。 - Adrián Deccico
当前版本支持:python manage.py reset_db - Amal Vijayan

25

这就是我想到的答案。谢谢。重置命令很好地解决了问题。 - Alex

19

我也遇到了同样的问题。

如果你不介意失去你的表格/数据,你可以快速解决这个问题,只需要在models.py文件中更正所需的数据类型,删除Migration文件夹和db.SQLite3文件,然后重新运行以下命令:

  1. python manage.py migrate
  2. python manage.py makemigrations
  3. python manage.py migrate
  4. python manage.py createsuperuser(创建一个管理员用户/密码来管理管理员页面)
  5. python manage.py runserver

这是我能够让它工作的唯一解决方案。谢谢! - Philip Liberato
这似乎是唯一可行的解决方案。非常被低估的答案。 - Manas Chaturvedi
1
是的,那确实有帮助,谢谢。 但是当我删除了迁移文件夹后,“makemigrations”命令无法识别我的模型。所以我不得不重新创建该文件夹并在其中放置“init.py”,然后一切都正常工作了。 - vk23
1
@kat Russo 如果不想删除数据怎么办? - shuboy2014
@NoMercy 下次尝试使用 'python manage.py makemigrations appname'。 - Josh

5
在Django 2.1.7中,我使用SQLite浏览器(也可以在Pypi上找到Python包)打开了db.sqlite3文件,并使用命令删除了表。请注意,保留了HTML标签。
DROP TABLE appname_tablename;

然后

DELETE FROM django_migrations WHERE App='appname';

然后再次运行。
python manage.py makemigrations appname
python manage.py migrate appname

删除整个迁移文件夹使这个工作正常。 - Kartik Chugh

2

这里可能需要对一些答案进行详细说明:

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

python manage.py dbshell

因此,最好使用以下内容:

DROP TABLE appname_tablename CASCADE;

为了删除任何相关表,可以在字段上有效地镜像“on_delete=CASCADE”方向。

1
在Django 1.9中,我必须按照Kat Russo的步骤进行操作,但第二次迁移有点棘手。您需要运行:
./manage.py migrate --run-syncdb

这很有帮助。 - NFern

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接