99

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

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

4

5 回答 5

187

如果您不关心数据:

最好的方法是删除数据库并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 ),但我还没有尝试过。

于 2011-06-26T16:28:54.387 回答
5

使用Django 扩展,运行:

./manage.py reset_db

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

./manage.py syncdb

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

于 2014-04-15T04:13:54.670 回答
4

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

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

所以对于OP的情况,我们只需要:

  1. 从 MySQL 中删除数据库
  2. 重新创建数据库
  3. python manage.py migrate
于 2018-01-30T09:58:23.967 回答
0

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

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

警告:

  • 可能无法在 Windows 上正常工作。
  • 可能会在数据库中保留一些旧表
于 2011-06-26T23:14:23.420 回答
0

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

例子:

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