我已经定义了一个模型,并通过manager.py syncdb
创建了相关的数据库。现在我已经为模型添加了一些字段,我再次尝试了syncdb
,但没有输出。在尝试从我的模板中访问这些新字段时,我得到一个“No Such Column”异常,这让我相信syncdb实际上没有更新数据库。这里的命令是什么?
答案 0 :(得分:138)
自Django 1.7+开始,内置migrations support允许进行数据库模式迁移以保留数据。这可能是比下面的解决方案更好的方法。
另一个不需要额外应用程序的选项是使用内置的manage.py
函数导出数据,清除数据库并恢复导出的数据。
以下方法将更新您应用的数据库表,但将完全销毁这些表中存在的任何数据。如果您对应用模型所做的更改不会破坏旧模式(例如,您添加了一个新的可选字段),则可以先将数据转储然后重新加载,如下所示:
python manage.py dumpdata <your_app> > temp_data.json
python manage.py reset <your_app>
python manage.py loaddata temp_data.json
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等工具都很棒。
答案 1 :(得分:37)
从Django 1.7开始,您现在可以使用本机迁移执行此操作。跑吧
python manage.py makemigrations <your app name>
python manage.py migrate
答案 2 :(得分:33)
看起来你需要的是一个迁移系统。 South非常好,工作得很好,有一些自动化工具可以简化您的工作流程。并且有一个很棒的tutorial。
注意:syncdb无法更新现有表。有时候不可能自动决定做什么 - 这就是为什么南方剧本很棒。
答案 3 :(得分:8)
Django的syncdb不会改变数据库中的现有表,因此您必须手动完成。我一直这样做的方式是:
如果你使用的是sqllite,那么一个好的经理就是firefox插件:link
答案 4 :(得分:8)
另一个工具是django evolution。大多数情况下不需要丢弃表格。
只需将其安装为任何其他django应用程序并运行:
python manage.py evolve --hint --execute
答案 5 :(得分:3)
deseb是一个很好的工具。
安装它之后,您可以编写./manage.py sqlevolve,它将生成使数据库结构与模型保持同步所必需的sql命令。
答案 6 :(得分:2)
您需要删除表,然后才能使用syncdb
重新创建表。
如果要保留现有数据,则需要卸载数据库,
删除表,运行syncdb
以构建新数据库,然后将旧数据重新加载到新表中。
有一些工具可以帮助解决这个问题。但是,在许多情况下,手动操作同样容易。
答案 7 :(得分:1)