Django创建Web程序后,中途你为某个模型添加了字段或者修改了字段,你希望把该表删除了,重新执行makemigrations、migrate。你可以直接进入dbshell界面,直接删除表。
具体操作如下:
进入命令行界面,切换到manage.py所在的目录:
python manage.py dbshell
注意,是dbshell,不是shell。
此时,命令行应是显示如下字样:
sqlite>
输入如下命令:
SELECT * FROM sqlite_master WHERE type='table';
这条命令不需要更改任何字符串,直接原样输入即可。
在sqlite>界面输入任何命令语句,后面必须加上;分号,才会执行该语句。但是退出命令不用加分号,退出dbshell,输入.quit。quit前有个点。后面也不加分号。
这是显示数据库中所有表格。表比较多,仔细看。里面有一些表是你创建Django项目时自动生成的表。也有你在自己的app里models.py创建的表。
删除表格输入如下命令:
DROP TABLE weekdays_plan_vocation;
weekdays_plan是我的Web程序中自己创建的app名称。vocation是指models.py中的模型Vocation。该模型在数据库中对应的表格名称就是weekdays_plan_vocation。
weekdays_plan_vocation是你要删除的表名。可以从上一句命令中执行结果中查询到。
从dbshell命令行界面执行Drop Table命令删除表格后,数据库中的表确实删除了。但是如果你此时就执行:
python manage.py makemigrations weekdays_plan
python manage.py migrate
是会报错的。原因在于db.sqlite3数据库中的django-migrations表中仍然存储着删除的表已经创建的信息。所以,它不会重新创建表。
此时,执行:
python manage.py migrate --fake weekdays_plan zero
python manage.py migrate --fake-initial weekdays_plan
python manage.py showmigrations weekdays_plan
接下来,你可以执行
python manage.py makemigrations train_plan
python manage.py migrate
就OK了。