我正在使用 Django 构建一个带有 MySQL 的网站。现在我正在学习,所以我需要经常更改模型,所以我希望所有表都被清除并创建新表。
但syncdb
不触及现有表。有没有更好的方法来处理这个问题?
我正在使用 Django 构建一个带有 MySQL 的网站。现在我正在学习,所以我需要经常更改模型,所以我希望所有表都被清除并创建新表。
但syncdb
不触及现有表。有没有更好的方法来处理这个问题?
如果您不关心数据:
最好的方法是删除数据库并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 ),但我还没有尝试过。
我认为 Django文档明确提到,如果意图再次从空数据库开始(这似乎是 OP 的意图),那么只需删除并重新创建数据库并重新运行migrate
(而不是使用flush
):
如果您希望从空数据库开始并重新运行所有迁移,则应删除并重新创建数据库,然后运行迁移。
所以对于OP的情况,我们只需要:
python manage.py migrate
最快(删除并创建包括数据在内的所有表):
./manage.py reset appname | ./manage.py dbshell
警告:
您可以使用 Django-Truncate 库来删除表的所有数据,而不会破坏表结构。
例子:
pip install django-truncate
settings.py
文件中的 INSTALLED_APPS:INSTALLED_APPS = [
...
'django_truncate',
]
python manage.py truncate --apps app_name --models table_name