一尘不染

在Django中更改数据库表

django

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

Syncdb不会更改现有表

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

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

似乎更改现有表将必须“手动”完成。

我想知道的是最好的方法。有两种解决方案:

  • 如文档所述,请在数据库中手动进行更改。
  • 对数据库进行备份,擦除,重新创建表(使用syncdb,因为现在它是从头开始创建表)并导入备份的数据(如果数据库很大,则可能会花费很长时间)
    有任何想法吗?

阅读 615

收藏
2020-04-03

共1个答案

一尘不染

手动执行SQL更改和转储/重新加载都是两个选项,但是你可能还想签出一些Django的schema-evolution程序包。最成熟的选择是django-evolution和South。

更新:自从最初编写此答案以来,django-evolution和dmigrations均已停止积极开发,而South已成为Django中架构迁移的实际标准。在下一两个版本中,South的某些部分甚至可以集成到Django中

2020-04-03