我已经通过manager.py syncdb
定义了模型并创建了其关联的数据库。现在我已经为模型添加了一些字段,我再次尝试syncdb
,但没有输出。在尝试从我的模板中访问这些新字段时,我得到一个“No Such Column”异常,导致我相信syncdb并未实际更新数据库。这里有什么正确的命令?更新django数据库以反映现有模型中的更改
回答
看起来像你需要的是一个迁移系统。 South真的很不错,工作得很好,有一些自动化工具来减轻你的工作流程。并有一个伟大的tutorial。
注意:syncdb无法更新您的现有表。有时候不可能自动决定做什么 - 这就是为什么南方脚本非常棒。
感谢您指出这个有趣的工具。任何有兴趣,有关于Django的数据库迁移这里有见地的讨论。 http://code.djangoproject.com/wiki/SchemaEvolution南显示 – theactiveactor 2009-12-31 15:37:44
的链接,“南方已被弃用,从Django的1.7向上,迁移中内置了Django的核心如果你运行的是以前的版本,你可以在BitBucket上找到版本库。“所以现在怎么办? – FaithReaper 2017-11-07 14:38:09
答案中的链接被打破 – 2017-11-24 14:34:10
deseb是一个很好的工具。
安装它之后,您可以编写./manage.py sqlevolve,它将生成必要的sql命令,以使数据库结构与您的模型保持同步。
这看起来像我所需要的。 sqlevolve也会提交更改吗? – theactiveactor 2009-12-31 15:26:05
您需要先删除表格,然后才能使用syncdb
重新创建它们。
如果你想保留你现有的数据,那么你需要卸载你的数据库, 删除你的表,运行syncdb
建立一个新的数据库,然后重新加载你的旧数据到你的新表。
有工具可以解决这个问题。但是,在很多情况下,手动操作也很容易。
Django的syncdb不会更改数据库中的现有表,因此您必须手动执行此操作。我一直这样做的方式是:
- 首先更改模型类。
- 然后运行:manage.py sql myapp。
- 看看它打印出来的sql,看看它代表了你将要做出的改变。
- 使用数据库管理器手动进行更改。
- 检查是否一切正常使用管理网站工作。
如果您正在使用sqllite一个优秀的管理者是Firefox插件:link
我其实认为这是最好的和最简单的解决方案 – shrimpwagon 2014-02-10 20:19:03
另一个工具是Django的演变。在大多数情况下,不需要删除表格。
只要将它安装任何其他Django应用程序,然后运行:
蟒蛇manage.py演变--hint --execute
As of Django 1.7+, built-in migrations support , allows for database schema migrations that preserve data. That's probably a better approach than the solution below.
另一种选择,不需要额外的应用程序,是使用内置的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这样的工具非常棒。
感谢你。正是我在找的东西。 – 2010-03-04 01:51:14
我认为这个解决方案是最好的。 – 2010-05-25 15:22:24
谢谢,最好的解决方案:) – 2010-08-31 16:13:40
我不明白的是flush实际上是重置数据库,因为它是在'syncdb'执行之后,但是可能新添加的字段?他们不会被创建 – 2014-09-05 12:04:28
从Django 1.7开始,您现在可以使用本机迁移来完成此操作。刚刚运行
python manage.py makemigrations <your app name>
python manage.py migrate
- 1. 实体框架更新模型以反映数据库中的更改
- 2. 何时更新数据库以反映财产更改?
- 3. 根据新的数据库更改更新模型
- 4. 从模型更新数据库(模型更改时)?
- 5. Django没有反映对urls.py的更改
- 6. Django模型更新后端数据库更新
- 7. 在数据库模型更改后传输现有数据(PostgreSQL)
- 8. 对DataGridView的更改没有反映在数据库中
- 9. 更新现有模型数据
- 10. 我需要更新模型视图并反映数据库中的这些更改
- 11. ObservableArray没有反映数据更新
- 12. 插入或更新映射模型数据到数据库
- 13. 更新具有新模式更改的LinqtoSql数据库?
- 14. Django的编辑和更新现有的数据在数据库
- 15. 从数据库更新时保留对模型的更改?
- 16. python更新类实例以反映类方法中的更改
- 17. 在Django中更改模型会导致数据库损坏?
- 18. Django - 访问前更新模型数据?
- 19. 当我删除添加或更新我的访问数据库时,它不反映数据库中的更改
- 20. 模型更改没有反映在视图中angularjs
- 21. 数据库中的更新未反映在JPA实体中
- 22. 数据库更改没有反映在图
- 23. 访问数据库更改没有反映在IIS上
- 24. Hibernate - 如何在运行时反映数据库中的更改?
- 25. django奥斯卡模型定制:模型更改不会反映,同时makemigrations
- 26. Sitefinity - 更新现有模型
- 27. 更新后的模型未在模板中反映
- 28. 是否有数据库更改的现代反应监听器
- 29. 更新数据库在Django中更改时
- 30. 更新现有的sqlite数据库中的列,但没有任何更改android
您应该更改接受的答案。 – User 2015-01-14 16:58:22