更新Django数据库以反映现有模型中的更改
我已经定义了一个模型,并通过 manager.py syncdb
创建了相关的数据库。现在我给这个模型添加了一些字段,我又试着运行 syncdb
,但没有任何输出。当我尝试从我的模板中访问这些新字段时,出现了“No Such Column”(没有这个列)的错误,这让我觉得 syncdb 并没有真正更新数据库。那么,我该用什么正确的命令呢?
8 个回答
45
从Django 1.7开始,你可以使用原生的迁移功能来做到这一点。只需要运行以下命令:
python manage.py makemigrations <your app name>
python manage.py migrate
139
从Django 1.7版本开始,内置的迁移支持可以让你在更改数据库结构时保留数据。这种方法可能比下面提到的解决方案更好。
还有一种不需要额外应用程序的选择,就是使用内置的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这样的工具就很有用了。