【发布时间】:2011-09-23 00:40:48
【问题描述】:
我正在使用 Django 使用 MySQL 构建网站。现在我正在学习,所以我需要经常更改模型,所以我希望所有表都被清除并创建新表。
但syncdb 不涉及现有表。有没有更好的方法来处理这个问题?
【问题讨论】:
标签: python mysql django django-1.3
我正在使用 Django 使用 MySQL 构建网站。现在我正在学习,所以我需要经常更改模型,所以我希望所有表都被清除并创建新表。
但syncdb 不涉及现有表。有没有更好的方法来处理这个问题?
【问题讨论】:
标签: python mysql django django-1.3
如果你不关心数据:
最好的方法是删除数据库并再次运行syncdb。或者你可以运行:
对于 Django >= 1.5
python manage.py flush
对于 Django
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),但我没试过。
使用Django Extensions,运行:
./manage.py reset_db
将清除数据库表,然后运行:
./manage.py syncdb
将重新创建它们(南方可能会要求您迁移东西)。
【讨论】:
我认为 Django docs 明确提到,如果意图再次从空数据库开始(这似乎是 OP 的意图),那么只需删除并重新创建数据库并重新运行 migrate(而不是使用flush):
如果您宁愿从空数据库开始并重新运行所有 迁移,您应该删除并重新创建数据库,然后运行 而是迁移。
所以对于 OP 来说,我们只需要:
python manage.py migrate
【讨论】:
最快(删除并创建包括数据在内的所有表格):
./manage.py reset appname | ./manage.py dbshell
注意:
【讨论】:
reset 已经运行 SQL,因此无需通过管道传输到 dbshell。如果您使用sqlreset 命令,那么只会打印出 SQL,您可以将其通过管道传送到 shell 以执行,但这是一个不必要的步骤。
您可以使用 Django-Truncate 库删除表的所有数据,而不会破坏表结构。
例子:
pip install django-truncate
settings.py 文件中将“django_truncate”添加到您的INSTALLED_APPS:INSTALLED_APPS = [
...
'django_truncate',
]
python manage.py truncate --apps app_name --models table_name
【讨论】: