更新django数据库以反映现有模型的更改

时间:2009-12-31 13:23:46

标签: python django django-models

我已经定义了一个模型,并通过manager.py syncdb创建了相关的数据库。现在我已经为模型添加了一些字段,我再次尝试了syncdb,但没有输出。在尝试从我的模板中访问这些新字段时,我得到一个“No Such Column”异常,这让我相信syncdb实际上没有更新数据库。这里的命令是什么?

8 个答案:

答案 0 :(得分:138)

  

自Django 1.7+开始,内置migrations support允许进行数据库模式迁移以保留数据。这可能是比下面的解决方案更好的方法。

另一个不需要额外应用程序的选项是使用内置的manage.py函数导出数据,清除数据库并恢复导出的数据。

以下方法将更新您应用的数据库表,但将完全销毁这些表中存在的任何数据。如果您对应用模型所做的更改不会破坏旧模式(例如,您添加了一个新的可选字段),则可以先将数据转储然后重新加载,如下所示:

Django 1.4.15及更早版本

python manage.py dumpdata <your_app> > temp_data.json
python manage.py reset <your_app>
python manage.py loaddata temp_data.json

Django 1.5及更新版

python manage.py dumpdata <your_app> > temp_data.json
python manage.py sqlclear <your_app> | python manage.py dbshell
python manage.py syncdb
python manage.py loaddata temp_data.json

reset命令已弃用,然后在Django 1.5

中删除

如果您的更改违反了旧架构,则无效 - 在这种情况下,SouthDjango Evolution等工具都很棒。

答案 1 :(得分:37)

从Django 1.7开始,您现在可以使用本机迁移执行此操作。跑吧

python manage.py makemigrations <your app name>
python manage.py migrate

答案 2 :(得分:33)

看起来你需要的是一个迁移系统。 South非常好,工作得很好,有一些自动化工具可以简化您的工作流程。并且有一个很棒的tutorial


注意:syncdb无法更新现有表。有时候不可能自动决定做什么 - 这就是为什么南方剧本很棒。

答案 3 :(得分:8)

Django的syncdb不会改变数据库中的现有表,因此您必须手动完成。我一直这样做的方式是:

  1. 首先更改模型类。
  2. 然后运行:manage.py sql myapp。
  3. 查看它打印出来的sql,看看它是如何代表你要做的改变。
  4. 使用数据库管理器手动进行更改。
  5. 使用管理站点检查一切是否正常。
  6. 如果你使用的是sqllite,那么一个好的经理就是firefox插件:link

答案 4 :(得分:8)

另一个工具是django evolution。大多数情况下不需要丢弃表格。

django evolution

只需将其安装为任何其他django应用程序并运行:

python manage.py evolve --hint --execute

答案 5 :(得分:3)

deseb是一个很好的工具。

安装它之后,您可以编写./manage.py sqlevolve,它将生成使数据库结构与模型保持同步所必需的sql命令。

答案 6 :(得分:2)

您需要删除表,然后才能使用syncdb重新创建表。

如果要保留现有数据,则需要卸载数据库, 删除表,运行syncdb以构建新数据库,然后将旧数据重新加载到新表中。

有一些工具可以帮助解决这个问题。但是,在许多情况下,手动操作同样容易。

答案 7 :(得分:1)

对于版本1.4.1及更高版本的用户,命令已更改为

python manage.py flush

在使用之前请先阅读official document 它会删除所有数据