关于数据库:如何从DJango中删除SQLite3中的表?

How do I drop a table from SQLite3 in DJango?

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

然后我转到python manage.py shell,尝试运行.objects.all(),但失败了,因为它说该列不存在。

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


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

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

然后,为了重新生成表,只需键入:

1
./manage.py syncdb


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

1
python manage.py reset app_name

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

这在Django 1.3中已被弃用,不再从Django 1.5中提供。


所有答案都不显示如何在应用程序中只删除一个表。这并不太难。dbshell命令将用户记录到sqlite3 shell中。

1
python manage.py dbshell

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

1
SELECT * FROM sqlite_master WHERE type='table';

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

1
DROP TABLE appname_modelname;

这应该足够了,即使该表与其他表有关系。现在,可以通过执行以下操作从sqlite shell注销:

1
.exit

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


获取DROP语句

python manage.py sqlclear app_name

那就试试看

江户十一〔一〕号

执行drop语句

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


我也有同样的问题。

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

然后重新运行以下命令:

  • python manage.py迁移
  • python manage.py生成迁移
  • python manage.py迁移
  • python manage.py createsuperuser(创建管理用户/pswd以管理管理页面)
  • python manage.py运行服务器

  • 在Django1.9,我不得不做KatRusso的步骤,但第二次迁移有点棘手。你得跑了

    1
    ./manage.py migrate --run-syncdb


    在django 2.1.7中,我在sqlite浏览器中打开了db.sqlite3文件(pypi上还有一个python包),并使用命令删除了表。

    1
    DROP TABLE appname_tablename;

    然后

    1
    DELETE FROM django_migrations WHERE App='appname';

    然后再跑一次

    1
    2
    python manage.py makemigrations appname
    python manage.py migrate appname