更新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不会改变数据库中的现有表,所以你必须手动完成。 我一直这样做的方式是:
- 首先更改模型类。
- 然后运行:manage.py sql myapp。
- 看看它打印出来的SQL,看看它代表了你将要做出的改变。
- 使用数据库pipe理器手动进行更改。
- 检查是否一切正常使用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
请在使用之前阅读官方文档 ,因为这会删除您的所有数据 。