当前位置:  开发笔记 > 编程语言 > 正文

改变Django中的数据库表

如何解决《改变Django中的数据库表》经验,为你挑选了3个好方法。

我正在考虑将Django用于我正在开始的项目(fyi,一个基于浏览器的游戏),我最喜欢的功能之一是syncdb用于根据我定义的Django模型自动创建数据库表(a我似乎无法在任何其他框架中找到的功能).当我在文档中看到这个时,我一直认为这太好了,不可能是真的:

Syncdb不会更改现有表

syncdb仅为尚未安装的模型创建表.它永远不会发出ALTER TABLE语句来匹配安装后对模型类所做的更改.对模型类和数据库模式的更改通常涉及某种形式的歧义,在这些情况下,Django必须猜测要进行的正确更改.存在关键数据在此过程中丢失的风险.

如果您对模型进行了更改并希望更改数据库表以匹配,请使用sql命令显示新的SQL结构,并将其与现有的表模式进行比较以计算更改.

似乎改变现有的表必须"手动"完成.

我想知道的是最好的方法.我想到了两种解决方案:

如文档所示,在DB中手动进行更改;

做一个数据库备份,擦除它,再次创建表(使用syncdb,因为它现在从头开始创建表)并导入备份数据(如果数据库很大,这可能需要很长时间)

有任何想法吗?



1> Carl Meyer..:

手动执行SQL更改和转储/重新加载都是选项,但您可能还想查看Django的一些架构演变包.最成熟的选择是django-evolution和South.

编辑:嘿,这里有dmigrations.

更新:由于这个答案最初编写,django-evolution和dmigrations都停止了积极的开发,而South已成为Django中模式迁移的事实标准.在下一个或两个版本中,南部的部分甚至可以集成到Django中.

更新:基于South的模式迁移框架(由South的作者Andrew Godwin撰写)包含在Django 1.7+中.



2> akaihola..:

正如同一主题的其他答案所述,请务必在YouTube上观看DjangoCon 2008 Schema Evolution Panel.

此外,地图上还有两个新项目:Simplemigrations和Migratory.



3> Dave Webb..:

一个很好的方法是通过固定装置,尤其是initial_data固定装置.

fixture是包含数据库的序列化内容的文件集合.所以就像拥有数据库的备份一样,但是Django知道它更容易使用,并且当你来做单元测试时会有额外的好处.

您可以使用数据库中当前数据创建夹具django-admin.py dumpdata.默认情况下,数据采用JSON格式,但也可以使用其他选项(如XML).存储装置的好地方是fixtures应用程序目录的子目录.

您可以使用django-admin.py loaddata但更重要的是加载修复,如果您的夹具有一个名称,initial_data.json它会在您执行时自动加载syncdb,从而省去了自行导入它的麻烦.

另一个好处是,当您运行manage.py test单元测试时,临时测试数据库也将加载初始数据夹具.

当然,当您将模型和列的属性添加到数据库时,这将起作用.如果从数据库中删除列,则需要更新夹具以删除该列的数据,这可能不是直截了当的.

在开发期间进行大量的数据库更改时,这种方法效果最佳.对于更新生产数据库,手动生成的SQL脚本通常最有效.

推荐阅读
凹凸曼00威威_694
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有