Database 如何从DJango中的SQLite3删除表?

Database 如何从DJango中的SQLite3删除表?,database,django,sqlite,Database,Django,Sqlite,我创建了一个模型,并运行了python manage.py syncdb。我认为这在数据库中创建了一个表。然后我意识到我做了一个不正确的列,所以我更改了它,并运行了相同的命令,认为它会删除旧表,然后添加一个新表 然后我转到python manage.py shell,并尝试运行.objects.all(),但失败了,因为该列不存在 我想清除旧表,然后再次运行syncdb,但我不知道如何执行该操作。使用 python manage.py sqlclear app\u name 然后试试看 pyth

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

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


我想清除旧表,然后再次运行syncdb,但我不知道如何执行该操作。

使用

python manage.py sqlclear app\u name

然后试试看

python manage.py dbshell

并执行DROP语句


查看

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

python manage.py reset app_name
删除并重新创建此应用程序模型使用的表


这在Django 1.3中被弃用,在Django 1.5中不再可用。清除应用程序只需编写:

./manage.py sqlclear app_name | ./manage.py dbshell 
然后,为了重建表,只需键入:

./manage.py syncdb

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

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

通常,Django根据以下约定命名表:“appname\u modelname”。因此,实现目标的SQL查询将类似于以下内容:

DROP TABLE appname_modelname;
DROP TABLE appname_tablename CASCADE;
这应该足够了,即使该表与其他表有关系。现在,您可以通过执行以下操作注销SQLITE shell:

.exit

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

我也遇到了同样的问题。 为了快速解决问题(如果您不在乎丢失表/数据),请使用所需的数据类型更正models.py文件,删除迁移文件夹和db.SQLite3文件

然后重新运行以下命令:

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

  • 在Django 1.9中,我必须执行Kat Russo的步骤,但是第二次迁移有点棘手。你必须跑

    ./manage.py migrate --run-syncdb
    

    在Django 2.1.7中,我在中打开了
    db.sqlite3
    文件(上还有一个Python包),并使用命令删除了表

    DROP TABLE appname_tablename;
    
    然后

    DELETE FROM django_migrations WHERE App='appname';
    
    然后再跑

    python manage.py makemigrations appname
    python manage.py migrate appname
    

    以下几个答案可能值得进一步探讨:

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

    python manage.py dbshell
    
    然后优先使用以下各项:

    DROP TABLE appname_modelname;
    
    DROP TABLE appname_tablename CASCADE;
    


    要删除任何相关表,请有效地镜像字段上的“on_delete=CASCADE”方向。

    这是出于设计。同步改变和下降将打开一个巨大的蠕虫罐。乔治给了你一个正确的答案。这就是我使用的解决方案。工作正常。在Django 1.3中,reset命令已被弃用,在Django 1.5中不再可用。请检查我的答案。当前版本支持::python manage.py reset_dba这是我发现的答案。非常感谢。碰巧reset命令工作得很好。这里有更符合版本要求的基本原则。我只想补充一点,您需要安装sqlite3。非常感谢您提到
    dbshell
    ——我以前使用过
    shell
    ,但在将我的DB换成mysql之后,它似乎不再允许我访问我的模型。
    dbshell
    现在将我直接插入mysql shell——非常酷。根据Schdiewie Kay的回答:在完成上述所有步骤后,对Django 1.9+运行“manage.py migrate--run syncdb”而不是“syncdb”,这是我唯一可以使用的解决方案。谢谢这似乎是唯一有效的解决办法。高度低估的答案。是的,这真的很有帮助,thanx。但是当我删除迁移文件夹时,
    makemigrations
    命令没有识别出我的模型。因此,我必须重新创建该文件夹并将
    \uuuu init\uuuuuu.py
    放入其中,然后一切正常。@kat Russo如果不想删除数据怎么办?@NoMercy下次尝试“python manage.py makemigrations appname”最终获得了解决方案。ThanksNo不再适用于Django 1.9+:这很有帮助删除整个迁移文件夹使其起作用