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中提供。
所有答案都不显示如何在应用程序中只删除一个表。这并不太难。
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语句
那就试试看
江户十一〔一〕号
执行drop语句
查看http://docs.djangoproject.com/en/dev/ref/django-admin/
我也有同样的问题。
为了快速解决问题(如果您不关心丢失表/数据),请使用所需的数据类型更正models.py文件,删除迁移文件夹和db.sqlite3文件,
然后重新运行以下命令:
在Django1.9,我不得不做KatRusso的步骤,但第二次迁移有点棘手。你得跑了
1 | ./manage.py migrate --run-syncdb |
在django 2.1.7中,我在sqlite浏览器中打开了
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 |
。