我正在考虑将Django用于我正在开始的项目(fyi,一个基于浏览器的游戏),我最喜欢的功能之一是syncdb
用于根据我定义的Django模型自动创建数据库表(a我似乎无法在任何其他框架中找到的功能).当我在文档中看到这个时,我一直认为这太好了,不可能是真的:
Syncdb不会更改现有表
syncdb仅为尚未安装的模型创建表.它永远不会发出ALTER TABLE语句来匹配安装后对模型类所做的更改.对模型类和数据库模式的更改通常涉及某种形式的歧义,在这些情况下,Django必须猜测要进行的正确更改.存在关键数据在此过程中丢失的风险.
如果您对模型进行了更改并希望更改数据库表以匹配,请使用sql命令显示新的SQL结构,并将其与现有的表模式进行比较以计算更改.
似乎改变现有的表必须"手动"完成.
我想知道的是最好的方法.我想到了两种解决方案:
如文档所示,在DB中手动进行更改;
做一个数据库备份,擦除它,再次创建表(使用syncdb,因为它现在从头开始创建表)并导入备份数据(如果数据库很大,这可能需要很长时间)
有任何想法吗?
手动执行SQL更改和转储/重新加载都是选项,但您可能还想查看Django的一些架构演变包.最成熟的选择是django-evolution和South.
编辑:嘿,这里有dmigrations.
更新:由于这个答案最初编写,django-evolution和dmigrations都停止了积极的开发,而South已成为Django中模式迁移的事实标准.在下一个或两个版本中,南部的部分甚至可以集成到Django中.
更新:基于South的模式迁移框架(由South的作者Andrew Godwin撰写)包含在Django 1.7+中.
正如同一主题的其他答案所述,请务必在YouTube上观看DjangoCon 2008 Schema Evolution Panel.
此外,地图上还有两个新项目:Simplemigrations和Migratory.
一个很好的方法是通过固定装置,尤其是initial_data
固定装置.
fixture是包含数据库的序列化内容的文件集合.所以就像拥有数据库的备份一样,但是Django知道它更容易使用,并且当你来做单元测试时会有额外的好处.
您可以使用数据库中当前数据创建夹具django-admin.py dumpdata
.默认情况下,数据采用JSON格式,但也可以使用其他选项(如XML).存储装置的好地方是fixtures
应用程序目录的子目录.
您可以使用django-admin.py loaddata
但更重要的是加载修复,如果您的夹具有一个名称,initial_data.json
它会在您执行时自动加载syncdb
,从而省去了自行导入它的麻烦.
另一个好处是,当您运行manage.py test
单元测试时,临时测试数据库也将加载初始数据夹具.
当然,当您将模型和列的属性添加到数据库时,这将起作用.如果从数据库中删除列,则需要更新夹具以删除该列的数据,这可能不是直截了当的.
在开发期间进行大量的数据库更改时,这种方法效果最佳.对于更新生产数据库,手动生成的SQL脚本通常最有效.