如果我更改Django模型中的字段,我该如何将其与数据库表同步?我是否需要在数据库上手动执行此操作,或者是否有一个有助于该过程的工具?
答案 0 :(得分:6)
唉,Django不支持任何简单的解决方案。
django将为您做的唯一事情是使用与您的新模型匹配的新表重新启动数据库:
$ #DON'T DO THIS UNLESS YOU CAN AFFORD TO LOSE ALL YOUR DATA!
$ python PROJECT_DIR/manage.py syncdb
下一个选项是使用manage.py的各种sql *选项来查看django将当前模型与数据库匹配的操作,然后发出自己的ALTER TABLE
命令以使一切正常。当然这很容易出错并且很难。
真正的解决方案是使用数据库迁移工具(例如south)来生成迁移代码。
这是一个similar question,讨论了django的各种数据库迁移选项。
答案 1 :(得分:4)
似乎无法在标记的答案中添加评论,可能是因为我没有足够的代表(如果SO告诉我的话,那就好了)。
无论如何,只是想在回复的帖子中添加它,我认为syncdb是错误的 - 一旦创建了syncdb并且在其中包含数据,它就会不触摸表。您应该不通过调用来丢失数据(否则,您如何为新应用添加新表?)
我认为海报是指重置命令,确实导致数据丢失 - 它会丢弃表并重新创建它,因此它将拥有所有最新的模型更改。 / p>
答案 2 :(得分:3)
Django Evolution可以提供帮助,但最好的选择是提前规划您的架构,或手动进行简单修改。或者,愿意通过删除表格并重新同步来干预您的测试数据。
答案 3 :(得分:2)
Django没有提供开箱即用的功能。
以下是来自doing it by hand的Django Book的一些信息(请参阅对数据库模式进行更改)。这适用于直接,简单的更改。
从长远来看,您可能希望使用迁移工具。有三个主要选择:
编辑:仔细阅读TokenMacGuy链接的问题,为了完整起见,我将在列表中再添加两个:
答案 4 :(得分:0)
只是提出一个额外的意见 - dmigrations非常好用且很清楚,但我会说South是你最好的选择。同样,它很容易进入,但它更强大,并且还支持比MySQL更多的数据库后端。它甚至可以处理MSSQL,如果这是你的事情