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

71 投票
8 回答
89602 浏览
提问于 2025-04-15 17:30

我已经定义了一个模型,并通过 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中被弃用并移除)

如果你的修改破坏了旧的结构,这种方法就不适用了,这时候像SouthDjango Evolution这样的工具就很有用了。

33

看起来你需要一个迁移系统。South 非常不错,运行得很好,还有一些自动化工具可以帮助你更轻松地工作。而且它有一个很棒的 教程


注意:syncdb 不能更新你现有的表。有时候很难自动决定该怎么做,这就是为什么 South 的脚本这么好用。

撰写回答