在Django中使用manage.py从CLI清除数据库的最简单方法是什么?


83

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

syncdb不涉及现有表。有没有更好的方法来解决此问题?

Answers:


152

如果您不关心数据:

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

对于Django> = 1.5

python manage.py flush

对于Django <1.5

python manage.py reset appname

(您可以将其添加--no-input到命令的末尾以跳过交互式提示。)

如果您确实关心数据:

从文档:

syncdb将仅为尚未安装的模型创建表。安装后,它将永远不会发出ALTER TABLE语句来匹配对模型类所做的更改。对模型类和数据库模式的更改通常涉及某种形式的歧义,在这种情况下,Django必须猜测要进行的正确更改。在此过程中可能会丢失关键数据。

如果对模型进行了更改,并希望更改数据库表以使其匹配,请使用sql命令显示新的SQL结构,并将其与现有的表模式进行比较以得出更改。

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

参考:常见问题解答-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),但我还没有尝试过。


4
South非常适合自动处理迁移。需要一点时间来适应,但是在开发过程中节省了很多麻烦的数据删除和重新创建数据库,并且一旦您的站点启用,并且在拥有宝贵数据的情况下就需要更改数据库结构时,它是必不可少的。
同行

11
推荐使用RESET命令。在Django 1.5中,命令已更新为flush。尝试使用python manage.py flushpython manage.py flush --noinput跳过交互式提示。
agconti

南已被弃用。请参考这里。并且您在此处给出的链接已断开。
Mukesh Sai Kumar

看来该命令已django-admin flush根据文档显示
Todd

4

使用Django Extensions,运行:

./manage.py reset_db

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

./manage.py syncdb

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


2
@becko首先执行此操作:pip install django-extensions
FacePalm

4

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

如果您希望从一个空的数据库开始并重新运行所有迁移,则应删除并重新创建数据库,然后运行迁移。

因此,对于OP而言,我们只需要:

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

0

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

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

警告:

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

3
reset已经运行了SQL,因此无需通过管道传递到dbshell。如果使用该sqlreset命令,则只会打印出SQL,您可以将其通过管道传输到Shell以执行,但这是不必要的步骤。
Michael Mior 2013年

0

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

例:

  1. 首先,使用终端/命令行安装django-turncate:
pip install django-truncate
  1. settings.py文件中的“ INSTALLED_APPS”中添加“ django_truncate” :
INSTALLED_APPS = [
    ...
    'django_truncate',
]
  1. 在终端中使用此命令从应用程序中删除表的所有数据。
python manage.py truncate --apps app_name --models table_name
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.