我制作了一个模型,并运行了python manage.py syncdb。我认为在db中创建了一个表。然后我意识到我错误地创建了一个列,所以我更改了它,并运行了相同的命令,认为它会丢弃旧表,并添加一个新表。
然后我去了python manage.py shell,并尝试运行.objects.all(),但它失败了,说该列不存在。
我想清除旧表,然后再次运行syncdb,但我无法弄清楚如何做到这一点。
答案 0 :(得分:69)
清除应用程序就像写作一样简单:
./manage.py sqlclear app_name | ./manage.py dbshell
然后为了重建你的表,只需输入:
./manage.py syncdb
答案 1 :(得分:38)
使用Django 1.4或更低版本时,另一种简单的方法是
python manage.py reset app_name
删除并重新创建此应用程序模型使用的表格。
这在Django 1.3中已弃用,并且不再可用于Django 1.5
答案 2 :(得分:36)
没有一个答案显示如何删除应用中的一个表。这不是太困难。 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应用程序,它将为您迁移表格。
答案 3 :(得分:25)
使用
获取DROP语句 python manage.py sqlclear app_name
然后尝试
python manage.py dbshell
并执行DROP语句
答案 4 :(得分:17)
我遇到了同样的问题。
要快速解决(如果您不关心丢失表/数据),请更正包含所需数据类型的models.py文件,删除Migration文件夹和db.SQLite3文件,
然后重新运行以下命令:
答案 5 :(得分:1)
在Django 1.9中,我不得不做Kat Russo的步骤,但第二次迁移有点棘手。你必须运行
./manage.py migrate --run-syncdb
答案 6 :(得分:1)
可能值得在这里扩展一些答案:
因此,您可以使用以下命令访问dbshell
:
python manage.py dbshell
然后优先使用以下内容:
DROP TABLE appname_tablename CASCADE;
要删除任何相关表,请在字段上有效地镜像“ on_delete = CASCADE”方向。
答案 7 :(得分:0)
在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