【问题标题】:What is the easiest way to clear a database from the CLI with manage.py in Django?在 Django 中使用 manage.py 从 CLI 清除数据库的最简单方法是什么?
【发布时间】:2011-09-23 00:40:48
【问题描述】:

我正在使用 Django 使用 MySQL 构建网站。现在我正在学习,所以我需要经常更改模型,所以我希望所有表都被清除并创建新表。

syncdb 不涉及现有表。有没有更好的方法来处理这个问题?

【问题讨论】:

    标签: python mysql django django-1.3


    【解决方案1】:

    如果你不关心数据:

    最好的方法是删除数据库并再次运行syncdb。或者你可以运行:

    对于 Django >= 1.5

    python manage.py flush
    

    对于 Django

    python manage.py reset appname
    

    (您可以在命令末尾添加--no-input,使其跳过交互式提示。)

    如果您确实关心数据:

    来自文档:

    syncdb 只会为 尚未上市的车型 安装。它永远不会发出 ALTER 用于匹配所做更改的 TABLE 语句 安装后到模型类。 对模型类和数据库的更改 图式通常涉及某种形式的 模棱两可,在这种情况下,Django 将不得不猜测正确的 要做出的改变。有一个风险是 关键数据将丢失在 过程。

    如果您对模型进行了更改 并希望更改数据库表 要匹配,使用sql命令 显示新的 SQL 结构和 将其与您现有的表格进行比较 架构来制定更改。

    https://docs.djangoproject.com/en/dev/ref/django-admin/

    参考:FAQ - https://docs.djangoproject.com/en/dev/faq/models/#if-i-make-changes-to-a-model-how-do-i-update-the-database

    人们也推荐 South (http://south.aeracode.org/docs/about.html#key-features),但我没试过。

    【讨论】:

    • South 非常非常适合自动处理迁移。需要一点时间来适应,但它可以在开发过程中省去大量删除和重新创建数据库的麻烦,并且在您的网站上线并且您需要在其中拥有宝贵数据的同时更改数据库结构时,它是必不可少的。
    • RESET 命令已弃用。在 Django 1.5 中,该命令已更新为 flush。尝试使用python manage.py flushpython manage.py flush --noinput 跳过交互式提示。
    • South 已被弃用。请参阅here。而且您在此处提供的链接已损坏。
    • 根据docs看来,命令现在是django-admin flush
    【解决方案2】:

    使用Django Extensions,运行:

    ./manage.py reset_db
    

    将清除数据库表,然后运行:

    ./manage.py syncdb
    

    将重新创建它们(南方可能会要求您迁移东西)。

    【讨论】:

    • @becko 先执行这个:pip install django-extensions
    【解决方案3】:

    我认为 Django docs 明确提到,如果意图再次从空数据库开始(这似乎是 OP 的意图),那么只需删除并重新创建数据库并重新运行 migrate(而不是使用flush):

    如果您宁愿从空数据库开始并重新运行所有 迁移,您应该删除并重新创建数据库,然后运行 而是迁移。

    所以对于 OP 来说,我们只需要:

    1. 从 MySQL 中删除数据库
    2. 重新创建数据库
    3. 运行python manage.py migrate

    【讨论】:

      【解决方案4】:

      最快(删除并创建包括数据在内的所有表格):

      ./manage.py reset appname | ./manage.py dbshell
      

      注意:

      • 可能无法在 Windows 上正常工作。
      • 可能会在数据库中保留一些旧表

      【讨论】:

      • reset 已经运行 SQL,因此无需通过管道传输到 dbshell。如果您使用sqlreset 命令,那么只会打印出 SQL,您可以将其通过管道传送到 shell 以执行,但这是一个不必要的步骤。
      【解决方案5】:

      您可以使用 Django-Truncate 库删除表的所有数据,而不会破坏表结构。

      例子:

      1. 首先,使用终端/命令行安装 django-turncate:
      pip install django-truncate
      
      1. settings.py 文件中将“django_truncate”添加到您的INSTALLED_APPS:
      INSTALLED_APPS = [
          ...
          'django_truncate',
      ]
      
      1. 在终端中使用此命令从应用程序中删除表的所有数据。
      python manage.py truncate --apps app_name --models table_name
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-03-25
        • 1970-01-01
        • 1970-01-01
        • 2010-11-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多