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

我已经定义了一个模型,并通过manager.py syncdb创build了相关的数据库。 现在,我已经添加了一些字段到模型,我再次尝试syncdb ,但没有输出显示。 试图从我的模板中访问这些新的领域,我得到一个“没有这样的列”exception,导致我相信syncdb并没有实际更新数据库。 这里有什么正确的命令?

似乎你需要的是一个迁移系统。 南是非常好,工作很好,有一些自动化工具,以减轻您的工作stream程。 并有一个很好的教程 。


注意:syncdb无法更新您的现有表。 有时候不可能自动决定做什么 – 这就是为什么南方的脚本非常棒。

另一个选项,不需要额外的应用程序,是使用内置的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中删除)

如果您的更改打破了旧的架构,这将无法工作 – 在这种情况下,像South或Django Evolution这样的工具是非常棒的。

从Django 1.7开始,您现在可以使用本机迁移来完成此操作。 赶紧跑

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

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

  1. 首先更改模型类。
  2. 然后运行:manage.py sql myapp。
  3. 看看它打印出来的SQL,看看它代表了你将要做出的改变。
  4. 使用数据库pipe理器手动进行更改。
  5. 检查是否一切正常使用pipe理网站。

如果你正在使用sqllite,一个好的经理是firefox插件: 链接

另一个工具是django进化。 大多数情况下不需要下降。

Django进化

只要安装它作为任何其他Django的应用程序,并运行:

python manage.py evolve –hint –execute

deseb是一个很好的工具。

安装后,你可以编写./manage.py sqlevolve,它会生成必要的sql命令来保持数据库结构与你的模型同步。

您需要先删除表,然后才能使用syncdb重新创build它们。

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

有工具可以帮助解决这个问题。 但是,在很多情况下,手动操作也很简单。

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

 python manage.py flush 

请在使用之前阅读官方文档 ,因为这会删除您的所有数据