【问题标题】:How to erase table data in Django?如何在 Django 中删除表数据?
【发布时间】:2016-03-09 02:49:38
【问题描述】:

我编写了一个简单的脚本来填充使用 Django 模型创建的表。我在开发过程中确实犯了错误,并且我的表中的数据已损坏(它可以访问,但图像、名称、url 错误)。我想删除这些数据并重新开始填充,但如果我只使用Model.objects.all().delete(),它看起来像表存储了以前的主键(所以新对象不是从pk=1 开始的)。

如果没有DROP TABLE,我如何删除所有以前的数据?如果DROP是最方便的方式,那是不是只有Django : Table doesn't exist这个恢复方案?

所需的功能是在每个脚本运行之前自动擦除数据。提前谢谢你。

【问题讨论】:

  • 你在使用 SQLite 吗?
  • “在每个脚本运行之前”是什么意思?
  • @doru 我在不同的机器上有不同的数据库管理系统(使用它们开发:家庭和工作)、sqlite 和 mysql。在这种情况下,django orm 不是与数据库无关吗?
  • @Sayse 1. 用 Django ORM 擦除以前的数据,表绝对是新的和干净的。 2. 开始填充。一切都来自同一个脚本。
  • 你的意思是你有一个你运行的脚本?你可以在开头添加flush

标签: python django


【解决方案1】:

你可以使用flush

从数据库中删除所有数据并重新执行任何同步后处理程序。已应用迁移的表未清除。

通过manage.py flush调用

有没有办法只对表集而不是数据库使用刷新?

不,不是真的。 Flush 可以选择指定要刷新的数据库 (-database),但您不能指定某些表,因为这可能会破坏表之间的关系,从而使数据无效。

如果您真的需要这样做,您当然可以创建自己的命令,该命令只会遍历表并删除对象,但这当然不会像 flush 那样执行 post-synchronization 步骤

【讨论】:

  • 小技巧,如果你经常使用这个命令,那么你可以输入python manage.py flush --noinput - 不需要一直输入yes
【解决方案2】:

有一种方法可以只删除给定 django 应用程序的表,而不是整个数据库:您可以使用 sqlclear 并将其通过管道传送到 dbshell 管理命令。

python manage.py sqlclear app_name | python manage.py dbshell

只有在应用没有迁移时才能应用该命令。请参阅here 了解更多信息。

【讨论】:

    【解决方案3】:

    在使用 loaddata 将数据反向移植到测试环境之前,我还需要一种清除特定表的方法。这适用于特定表:

    echo "delete from my_table" | python manage.py dbshell
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-11-21
      • 2010-09-23
      • 2011-05-30
      • 1970-01-01
      • 1970-01-01
      • 2019-06-12
      • 2018-06-29
      • 2021-02-28
      相关资源
      最近更新 更多