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


69

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


2
您应该更改接受的答案。
用户

Answers:


33

似乎您需要的是迁移系统。South真的很好,工作很好,有一些自动化工具可以简化您的工作流程。并且有很棒的教程


注意:syncdb无法更新您现有的表。有时,无法自动决定要做什么-这就是为什么南方文字如此出色的原因。


6
感谢您指出这个有趣的工具。:任何有兴趣,有关于Django的数据库迁移有见地的讨论,在这里code.djangoproject.com/wiki/SchemaEvolution
theactiveactor

South的链接显示,“ South已弃用。从Django 1.7起,迁移已内置到Django的核心中。如果运行的是早期版本,则可以在BitBucket上找到存储库。”。所以现在怎么办?
WesternGun

答案中的链接已断开
Shivaraj Patil

138

从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这样的工具非常有用


谢谢你 正是我想要的。
罗布·弗莱厄蒂

我认为这种解决方案是最好的。
晓啸2010年

+1喜欢使用django中已经存在的东西,而没有任何其他django应用程序。必填
Hafiz 2012年

20
对于django 1.5.1用户:不再支持manage.py reset。刷新可用于删除所有内容。您还可以手动使用ALTER TABLE或DROP TABLE语句(来自django ref):python manage.py flush
阿里(Ali)

如果我添加的字段是ManyToManyField,则错误:无法序列化数据库:(1146,“表'gavacafe.subject_subject_vote_users'不存在”)
liuzhijun 2013年


9

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

  1. 首先更改模型类。
  2. 然后运行:manage.py sql myapp。
  3. 查看它输出的sql,看看它如何表示您将要进行的更改。
  4. 使用数据库管理器手动进行更改。
  5. 使用管理网站检查一切是否正常运行。

如果您使用的是sqllite,则firefox插件是一个很好的管理器:link


我实际上认为这是最好,最简单的解决方案
虾车2014年

8

另一个工具是django evolution。在大多数情况下,无需删除表。

django进化

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

python manage.py evolution-提示--execute


3

deseb是实现这一目标的绝佳工具。

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


这看起来像我需要的。sqlevolve是否也提交更改?
theactiveactor

2

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

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

有一些工具可以帮助您。但是,在很多情况下,手动进行操作同样容易。


1

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

python manage.py flush

使用前请先阅读正式文档,因为它将删除所有数据


我不明白的是,刷新实际上是在syncdb执行数据库后重置数据库,但是可能新添加的字段呢?他们没有被创造出来
Pierre de LESPINAY 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.