我正在使用Django构建一个使用MySQL的网站。现在我正在学习所以我需要经常更改模型,所以我希望清除所有表并创建新表。
但syncdb
不会触及现有表格。有没有更好的方法来处理这个问题?
答案 0 :(得分:127)
如果您不关心数据:
最好的方法是删除数据库并再次运行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/
人们也推荐South(http://south.aeracode.org/docs/about.html#key-features),但我没有尝试过。
答案 1 :(得分:4)
使用Django Extensions,运行:
./manage.py reset_db
将清除数据库表,然后运行:
./manage.py syncdb
会重新创建它们(南方可能会要求您迁移它们)。
答案 2 :(得分:3)
我认为Django docs明确提到如果意图是从空DB开始(这似乎是OP的意图),那么只需删除并重新创建数据库并重新运行migrate
(而不是使用flush
):
如果您希望从空数据库开始并重新运行所有数据库 迁移时,您应该删除并重新创建数据库,然后运行 而是迁移。
因此,对于OP的情况,我们只需要:
python manage.py migrate
答案 3 :(得分:0)
最快(删除并创建包括数据在内的所有表格):
./manage.py reset appname | ./manage.py dbshell
注意:
答案 4 :(得分:0)
您可以使用Django-Truncate库删除表的所有数据,而不会破坏表结构。
示例:
pip install django-truncate
settings.py
文件中的“ INSTALLED_APPS”中添加“ django_truncate”:INSTALLED_APPS = [
...
'django_truncate',
]
python manage.py truncate --apps app_name --models table_name