【问题标题】:How do I drop a table from SQLite3 in DJango?如何从 DJango 的 SQLite3 中删除表?
【发布时间】:2011-01-18 04:20:15
【问题描述】:

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

然后我去python manage.py shell,并尝试运行.objects.all(),它失败了,说那个列不存在。

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

【问题讨论】:

  • 这是设计使然。同步变更和掉落会打开一大罐蠕虫。乔治有你正确的答案。

标签: database django sqlite


【解决方案1】:

可能值得在这里扩展一些答案:

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

python manage.py dbshell

然后优先使用以下内容:

DROP TABLE appname_tablename CASCADE;

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

【讨论】:

    【解决方案2】:

    在 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
    

    【讨论】:

    • 删除整个迁移文件夹使这项工作成功
    【解决方案3】:

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

    ./manage.py migrate --run-syncdb
    

    【讨论】:

    • 这很有帮助
    【解决方案4】:

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

    python manage.py reset app_name
    

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

    这在 Django 1.3 中已被弃用,在 Django 1.5 中不再可用

    【讨论】:

    • 这是我使用的解决方案。完美运行。
    • 重置命令在 Django 1.3 中已被弃用,在 Django 1.5 中不再可用。请检查我的答案。
    • 当前版本支持:: python manage.py reset_db
    【解决方案5】:

    没有一个答案显示如何只删除应用程序中的一个表。这不是太难。 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 应用程序。

    【讨论】:

    • 你在这里有更多版本证明的基本原则答案。我只是补充一下,您需要安装 sqlite3。
    • 非常感谢你提到dbshell——我以前用过shell,但是在将我的数据库换成mysql之后,它似乎不允许我访问我的模型了。 dbshell 现在将我直接插入到我的 mysql shell 中——非常酷。
    • 来自 Schdiewie Kay 的回答:按照上述所有步骤操作后,为 Django 1.9+ 运行“manage.py migrate --run-syncdb”而不是“syncdb”
    【解决方案6】:

    我遇到了同样的问题。

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

    然后重新运行以下命令:

    1. python manage.py 迁移
    2. python manage.py makemigrations
    3. python manage.py 迁移
    4. python manage.py createsuperuser(创建管理员用户/pswd 来管理管理员页面)
    5. python manage.py runserver

    【讨论】:

    • 这是我可以开始工作的唯一解决方案。谢谢!
    • 这似乎是唯一可行的解​​决方案。被严重低估的答案。
    • 是的,这真的很有帮助,谢谢。但是当我删除迁移文件夹时,makemigrations 命令无法识别我的模型。所以我不得不重新创建该文件夹并将__init__.py 放入其中,然后一切正常。
    • @kat Russo 如果不想删除数据怎么办?
    • @NoMercy 下次尝试'python manage.py makemigrations appname'
    【解决方案7】:

    使用

    获取 DROP 语句

    python manage.py sqlclear app_name

    那就试试

    python manage.py dbshell

    并执行 DROP 语句

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

    【讨论】:

    • 这是我想出来的答案。谢谢你。碰巧重置命令效果很好。
    【解决方案8】:

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

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

    然后为了重建您的表,只需输入:

    ./manage.py syncdb
    

    【讨论】:

    猜你喜欢
    • 2020-08-31
    • 2019-06-12
    • 2021-08-18
    • 2020-12-15
    • 2017-06-28
    • 1970-01-01
    • 2022-09-27
    • 1970-01-01
    • 2021-11-08
    相关资源
    最近更新 更多