django syncdb和更新的模型


86

我最近更新了我的模型,在其中添加了BooleanField,但是当我这样做时python manage.py syncdb,它没有将新字段添加到模型的数据库中。我怎样才能解决这个问题 ?


17
Django不支持这种基本功能,这使我根本无法使用它来创建模型。他们认为可以处理表创建但不能(就地)进行表修改的ORM具有发行质量,这一事实几乎使我无法完全使用Django。
格伦·梅纳德

3
Django允许如此出色的应用程序可插入性这一事实使Django很棒,并使其缺乏对表修改的内置支持基本上无关紧要。安装应用程序有多困难?
多米尼克·罗杰

@Glenn,在设计阶段正确规划模型,您就不会遇到这个问题。如果要添加新功能,请使用像South这样的迁移套件。就地迁移通常很复杂;无论如何,对于一个简单的Django管理命令来说,它太复杂了。
苏联2009年

Answers:


100

从Django 1.7开始

Django内置了对迁移的支持-请查看文档

对于Django 1.6及更早版本

Django不支持开箱即用的迁移。Django有一个可插拔的应用程序可以做到这一点,而且效果很好。叫


1
注:我用了南具有自定义数据库后端迁移模型(如Django的MSSQL)问题

1
南非常非常好!感谢您的提示
Julien Greard 2014年

14

Django当前不会自动执行此操作。您的选择是:

  1. 从数据库中删除表,然后使用syncdb以新形式重新创建它。
  2. 使用来打印数据库的SQL python manage.py sql (appname),找到该字段添加的行,然后使用alter tableSQL命令手动添加它。(这也将允许您选择当前记录的字段值。)
  3. 使用South(根据Dominic的答案)。

11

跟着这些步骤:

  1. 使用dumpdata management命令将数据导出到灯具
  2. 放下桌子
  3. 运行syncdb
  4. 使用loaddata management命令从固定装置重新加载数据

完整的拖放操作是否可以就地完成?这太可怕了。
格伦·梅纳德

3
它是一个简单的管理命令,而不是迁移套件!Django无法预测您的数据如何更改或如何保存,因此它坚持要您自己进行。如果您不喜欢它,请使用像South这样的迁移工具。
苏联2009年

8

正如最佳答案中所建议的那样,我尝试使用South,并且在一个小时的模糊迁移错误中沮丧之后,决定改用Django Evolution

我认为入门比South更加容易,并且在我第一次输入时效果很好./manage.py evolve --hint --execute,所以我对此感到满意。


7
在使用Django Evolution和South之后将近一年的时间,我正在改变自己的看法。南方很棒。但是从某种意义上说,它非常类似于Git,必须确保您真正了解它的工作原理。如果您盲目地键入命令,则很可能在您或团队中的某人第一次犯错时就搞砸了。
丹·阿布拉莫夫

2

Havent曾用过django,但我似乎还记得syncdb确实在db表上执行了alter命令。您必须删除该表然后再次运行,它将再次创建。

编辑:对不起,请不要执行更改。


然后它不运行alter table命令,而是运行create table命令。
Dominic Rodger

好吧,我在数据库中有数据,所以如果我不放弃就克服了这个问题,那将是很棒的。
Hellnar酒店

1
我想您想说,syncdb不会执行alter命令。您不必删除表,也可以将新字段手动添加到sql中。
Odif Yltsaeb,2009年

是的,但是问题是引用了syncdb的使用,因此在这种情况下,您必须删除表以使用syncdb或使用下面提到的插件。
Alex H

1
如果您对South不满意,请尝试使用Django Evolution。对我来说很好。stackoverflow.com/questions/1605662/…–
丹·阿布拉莫夫

1

在Django 1.6中

  • 首先,我们运行- python manage.py sql <app name>

  • 然后我们必须运行- python manage.py syncdb


0

如果您使用Apache和MySQL运行Django,请在使用makemigrations进行迁移后重新启动apache 。

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.